2009-08-27 26 views
6

Tôi đã chơi đùa với Moose, cảm nhận được điều đó. Tôi muốn một ví dụ về các chức năng ảo thuần túy như trong C++ nhưng theo cách nói của Moose (đặc biệt trong cách nhìn C++). Tôi biết rằng ngay cả với Moose áp đặt một mô hình chặt chẽ hơn bình thường Perl, vẫn còn nhiều hơn một cách để làm những gì tôi đang yêu cầu (thông qua phương thức sửa đổi hoặc SUPER:: cuộc gọi). Đó là lý do tại sao tôi yêu cầu cụ thể cho việc thực hiện giống như C++ càng nhiều càng tốt. Còn về "tại sao?" của hạn chế này? Chủ yếu là tò mò, nhưng cũng có kế hoạch để cổng một số mã C + + để Perl với Moose trong một cách mà C++ - người trung tâm có thể chủ yếu là xác định với.C++ - giống như việc sử dụng Moose với Perl cho OOP

+0

Tôi đã chuyển nỗ lực của mình từ câu hỏi xuống phần câu trả lời. –

+1

Yikes, câu hỏi này đã là câu trả lời thứ 3 khi Googling cho các chức năng ảo thuần túy trong Perl với Moose. Đối với những người quan tâm, các cuộc thảo luận perlmonks bán liên quan đến điều này là ở đây: http://www.perlmonks.org/?node_id=742013. Họ dường như không có câu trả lời cụ thể ở đó. –

+0

Có lẽ vì tất cả mọi người ngoại trừ lập trình viên C++ gọi họ là "phương pháp". – jrockway

Trả lời

5

tôi có thể nghĩ ra cách này sử dụng vai trò thay vì subclassing:

{ 
    package AbstractRole; 
    use Moose::Role; 
    requires 'stuff'; 
} 

{ 
    package Real; 
    use Moose; 
    with 'AbstractRole'; 
} 

này sẽ cung cấp một lỗi biên dịch vì Bất không có thứ xác định.

Thêm thứ phương pháp để thực hiện sẽ làm cho nó hoạt:

{ 
    package Real; 
    use Moose; 
    with 'AbstractRole'; 

    sub stuff { print "Using child function!\n" } 
} 
+0

Vâng, đây là cách nó sẽ được thực hiện nếu tôi chỉ muốn có một giao diện. Tôi đang tìm hiểu thông qua nghiên cứu và thảo luận ở đây rằng tôi có thể không thể thực hiện _exactly_ những gì tôi hy vọng sẽ làm. –

+0

Tôi nghĩ rằng điều này sẽ giúp bạn hầu hết mọi cách. Trò chuyện với những người Moose ở #moose trên irc.perl.org hoặc danh sách gửi thư [email protected] nếu bạn cảm thấy có lợi ích trong việc mở rộng thêm điều này. – draegtun

+0

@draegtun Vâng, tôi nghĩ rằng đây là xấp xỉ tốt nhất tôi có thể hy vọng. Cảm ơn bạn đã giúp đỡ! –

1

Dưới đây là là nỗ lực của tôi (không có vai trò, đối với thông tin về vai trò xem câu trả lời khác):

package Abstract; 
use Moose; 

sub stuff; 

package Real; 
use Moose; 
extends 'Abstract'; 

override 'stuff' => sub { print "Using child function!\n"; } 
+0

Tôi không biết bạn đang nói về cái gì, nhưng có vẻ như bạn muốn 'Abstract' là một lớp cơ sở trừu tượng và phương thức' stuff' (không hoạt động) là thuần ảo. Chỉ cần viết 'nội dung phụ {}' ngay lập tức vi phạm điều đó. Vì vậy, phương thức lớp cơ sở có lẽ nên là 'sub stuff {croak}'. –

+0

@ Sinan Tôi đã đi cho một cái gì đó giống như C++ 's: ảo void stuff() = 0; –

+0

@Sanan Tôi có hai mối quan tâm với việc thêm vào các nội dung: 1) nó không biên dịch cho tôi và 2) bạn có thể tranh luận rằng croak là một hình thức thực hiện, (trừ khi tôi hiểu sai định nghĩa của các hàm ảo thuần túy)) hoàn toàn trái ngược với những gì tôi đang làm. Tôi đang chỉnh sửa nội dung phụ {; } là công cụ phụ; –

2

Có vẻ tôi không thể thực hiện chính xác những gì tôi muốn với Moose, nhưng tôi có thể đến rất gần với Vai trò. Dưới đây là thông tin từ hướng dẫn Moose entry cho Vai trò:

Vai trò Versus lớp trừu tượng cơ sở

Nếu bạn đã quen thuộc với khái niệm của lớp cơ sở trừu tượng trong ngôn ngữ khác, bạn có thể bị cám dỗ sử dụng vai trò theo cùng một cách.

Bạn có thể xác định vai trò "chỉ giao diện" , vai trò chỉ chứa danh sách các phương thức được yêu cầu .

Tuy nhiên, bất kỳ lớp nào tiêu thụ vai trò này phải thực hiện tất cả các phương thức bắt buộc trực tiếp hoặc thông qua kế thừa từ cha mẹ. Bạn không thể trì hoãn yêu cầu phương thức kiểm tra để chúng có thể được triển khai bởi các lớp con tương lai.

Vì vai trò xác định các phương thức bắt buộc trực tiếp, việc thêm lớp cơ sở vào danh sách kết hợp sẽ không đạt được bất kỳ thứ gì. Chúng tôi khuyên bạn chỉ cần tiêu thụ vai trò giao diện trong mỗi lớp mà triển khai giao diện đó.

+0

snap! Câu trả lời của bạn xuất hiện giống như tôi đã dọn dẹp của tôi ;-) – draegtun

+0

@draegtun Hài hước như thế nào điều đó xảy ra! Câu trả lời của bạn thực sự hữu ích, đặc biệt là đối với những người đang tìm cách triển khai giao diện với Moose. Tôi vừa đưa ra một câu hỏi kỳ quặc mà tôi đang tìm kiếm thông qua nghiên cứu sâu hơn có thể không có một câu trả lời xác định. Tôi vẫn đang cố gắng quyết định nếu điều này là bởi vì tôi hoàn toàn không hiểu khu vực trước khi hỏi, hoặc nếu Moose thiếu tính năng này;) –

+2

Hmm. Là nó chỉ cho tôi hoặc là giúp đỡ thực sự không phải là rất hữu ích? Nó dường như nói 'nếu bạn muốn thực hiện một lớp trừu tượng với vai trò nó không hoạt động bởi vì chúng không giống nhau; thay vào đó, * nhìn qua đó, một con lợn bay *! Tôi vẫn muốn được quan tâm đến (a) làm thế nào để làm một hệ thống phân cấp của các lớp trừu tượng (đặc biệt nếu MooseX :: ABC được coi là tốt hay không) hoặc cách khác (b) tại sao ABC là xấu cho các chương trình Moose. – ijw

5

Bạn cũng có thể muốn có một cái nhìn tại Jesse Luehrs' MooseX::ABC. Nó có vẻ rất giống với một số triển khai ở đây. Từ bản tóm tắt:

package Shape; 
use Moose; 
use MooseX::ABC; 

requires 'draw'; 

package Circle; 
use Moose; 
extends 'Shape'; 

sub draw { 
    # stuff 
} 

my $shape = Shape->new; # dies 
my $circle = Circle->new; # succeeds 

package Square; 
use Moose; 
extends 'Shape'; # dies, since draw is unimplemented 

Tôi biết rằng Jesse là lập trình viên C++ trong ngày.

+0

Cảm ơn lời khuyên, tôi chắc chắn sẽ kiểm tra điều đó! –

+0

Đã cập nhật liên kết từ chỉ tại phiên bản 0.20 lên phiên bản hiện tại. Phiên bản 0.30 đã thêm vào lớp con của các lớp cơ sở trừu tượng với các lớp trừu tượng hơn nữa. – spazm

Các vấn đề liên quan