2009-07-02 27 views
11

Tôi hiểu rằng mô hình OO của Perl khá nguyên thủy; nó là, trong hầu hết các khía cạnh, về cơ bản là một hack không gian tên.Tôi có thể tạo giao diện giống như Java trong Perl không?

Tuy nhiên, tôi tự hỏi liệu có thể tạo ra thứ gì đó giống như "giao diện" không? Mục tiêu của tôi là có một lớp cơ sở mà từ đó những người khác được mở rộng có mục đích chính là bắt buộc thực hiện các phương thức nhất định (theo tên là tốt, không cần chữ ký) bởi các lớp con đó. Tôi không thực sự quan tâm nếu đó là một lớp "thuần túy ảo" (như một "giao diện" trong Java) hoặc một lớp cụ thể với các khai triển thực tế cho các phương thức đó trong lớp cha, nhưng điều tôi muốn là làm cho nó cần thiết subclass thực hiện các phương thức nhất định của superclass.

Điều này có khả thi không? Nếu vậy, làm thế nào?

+6

OO của Perl không phải là nguyên thủy, nó chỉ là một cách tiếp cận khái niệm khác. –

+0

Tôi nghĩ anh ấy có nghĩa là nguyên thủy về mặt tính năng được cung cấp. OO có một vài nguyên tắc hướng dẫn, và đóng gói là một trong số chúng. Perl đang thực hiện đóng gói theo quy ước, trừ khi một người sử dụng các thư viện hiện đại hơn, vì vậy có, OO của Perl là nguyên thủy, dựa vào các nhà phát triển trong tương lai để duy trì quy ước thay vì kiểm tra thời gian biên dịch nghiêm ngặt. Ý tôi là, người này đang yêu cầu giao diện/lớp học ảo thuần túy, và nó không có mà không có phần mở rộng. Đó không phải là "đầy đủ tính năng". –

Trả lời

5

Tôi nghĩ rằng toàn bộ ý tưởng của uỷ quyền thực hiện/quá tải của các chức năng lớp cơ sở của/tàu ngầm là nước ngoài để Perl. Tại thời điểm đó bạn sẽ hình dung cơ chế thực thi làm việc?

Nếu bạn không hài lòng khi thực hiện việc này khi chạy, bạn có thể chết nếu việc triển khai lớp cơ sở của bạn được gọi.

EDIT: Trên thực tế, có, Class :: Contract dường như là cách để đi.

10

Tôi không chắc chắn cách bạn có thể triển khai. Tuy nhiên, hãy xem Moose, đó là "Hệ thống đối tượng hậu hiện đại cho Perl 5".

+8

Với Moose, vai trò có thể thực hiện chức năng của giao diện Java. Họ cũng có thể làm nhiều hơn, nhưng vai trò chỉ có một danh sách các phương thức cần thiết là một giao diện. –

1

giải pháp đơn giản mà tạo ra lỗi khi chạy:

package SomeVirtualClass; 

use strict; 
use warnings; 

use Carp; 

sub some_method { croak "virtual method some_method not overridden" } 
+0

Vâng, vâng, không nghi ngờ gì đây là một khả năng. Tuy nhiên, thành thật mà nói, tôi đang tìm kiếm thứ gì đó ở cấp độ ngữ nghĩa hơn. –

5

Class::Contract có thể trợ giúp việc này. Nó hỗ trợ kiểm tra hợp đồng thời gian biên dịch.

26

Dưới đây là một câu trả lời bằng Moose ...

package Comparable; 
use Moose::Role; 

requires 'eq'; 

package Person; 

has size => (
    is => 'ro', 
    does => 'Comparable', 
); 

Bây giờ thuộc tính kích thước phải là một đối tượng mà thực hiện "giao diện" năng tương đương. Trong Moose-land, các giao diện là các vai trò và các vai trò có thể không chỉ là định nghĩa giao diện.

2

Tôi có một mô hình nhẹ tôi gọi là "tương thích", và tôi thảo luận về nó trong câu trả lời của tôi để How important is it to indicate if a class implements an interface in Perl?

Nó chỉ là một vấn đề gắn bó gói giả trong @ISA:

our @ISA = qw<... X::Compatible ...>; 

Quý khách nghỉ ngơi mã của họ nếu bạn không làm những gì họ mong đợi từ X. Trong thực tế, tôi có một loạt các hành vi được ghi lại mà tôi sử dụng lại, nhưng một lớp cho tôi biết đó là X::Compatible là những gì tôi sử dụng để đảm bảo bản thân rằng nó có thể làm những gì tôi mong đợi.

Kể từ perl 5.10 đã giới thiệu khái niệm DOES, đó là khoảng như trọng lượng nhẹ, một đối tượng X::Compatible kế thừa từ một lớp cơ sở Object::Compatible mà thực hiện một cơ sở DOES bằng cách nhìn qua @ISA cho /::Compatible$/ và trả lời khẳng định cho bất cứ điều gì trong đó.Ý tưởng là:

$object->DOES($x) == $object->isa($x . '::Compatible') 
Các vấn đề liên quan