Tôi đang cố gắng triển khai lớp Moose :: Vai trò hoạt động giống như lớp trừu tượng sẽ trong Java. Tôi muốn thực hiện một số phương thức trong Role, nhưng sau đó có khả năng ghi đè lên các phương thức đó trong các lớp cụ thể. Nếu tôi thử điều này bằng cách sử dụng cùng một phong cách hoạt động khi tôi mở rộng các lớp, tôi gặp lỗi Cannot add an override method if a local method is already present
. Dưới đây là một ví dụ:Làm thế nào để ghi đè lên một phụ trong một Moose :: Vai trò?
lớp trừu tượng của tôi:
package AbstractClass;
use Moose::Role;
sub my_ac_sub {
my $self = shift;
print "In AbstractClass!\n";
return;
}
1;
lớp bê tông của tôi:
package Class;
use Moose;
with 'AbstractClass';
override 'my_ac_sub' => sub {
my $self = shift;
super;
print "In Class!\n";
return;
};
__PACKAGE__->meta->make_immutable;
1;
Và sau đó:
use Class;
my $class = Class->new;
$class->my_ac_sub;
Tôi có làm điều gì sai? Là những gì tôi đang cố gắng để thực hiện nghĩa vụ phải được thực hiện một cách khác nhau? Là những gì tôi đang cố gắng để làm không phải được thực hiện ở tất cả?
Sử dụng lớp trừu tượng để mô hình hóa lớp trừu tượng! Điều này chỉ yêu cầu bạn thực hiện việc xây dựng không thể (ví dụ: cung cấp BUILDALL để phát hiện lỗi). – amon
Có lẽ cách Moose để làm điều này là có 'require 'my_ac_sub';' trong Role, * not * phương thức "virtual". Moose :: Vai trò sau đó sẽ kiểm tra nó đã được tạo thành một lớp với phương pháp có sẵn, –
Tôi đã thử chạy mã và sau đó thay thế ghi đè bởi chỉ 'my_ac_sub' phụ và đột nhiên nó hoạt động như mong đợi. Có gì sai với "sửa chữa" đó không? (Disclaimer: Tôi mới đến Moose). – Dallaylaen