虽然重构我试图保留一些向后兼容性。我想知道是否有可能在对象上有一个方法,但是阻止该方法被子类化的类继承?例如给定
package Class {
use Moose;
sub foo { 'test' };
}
my $class = Class->new;
$class->foo;
可行,但
package Extended::Class {
use Moose;
extends 'Class';
}
my $class = Extended::Class->new;
$class->foo;
不会。
我意识到这可能违反了某些原则,但我不得不弃用这些接口。
答案 0 :(得分:4)
怎么样:
use 5.014;
package Class {
use Carp qw( croak );
use Moose;
sub foo {
my $self = shift;
croak unless __PACKAGE__ eq ref $self;
return 'test';
}
}
package Extended::Class {
use Moose;
extends 'Class';
}
package main {
my $x = Class->new;
say $x->foo;
my $y = Extended::Class->new;
say $y->foo;
}
答案 1 :(得分:1)
你考虑过代表团吗?
package Original {
use Moose;
sub foo { 23 }
sub bar { 42 }
}
package Subclass {
use Moose;
has original => (
buidler => '_build_original',
handles => [qw( bar )],
);
sub _build_original { Original->new }
}
当然,如果你可以使用它,这取决于你的情况。子类不会通过上述isa
检查(但如果必须,可以覆盖isa
)。根据用例,将原始参数传递给您正在扩展的对象也会很烦人。
答案 2 :(得分:0)
因为它首先在foo
中查找方法Extended::Class
,所以你可以在那里声明一个不做任何事情的方法。这样,除非你在子类中的某个地方这样做,否则不会调用继承的。
我不确定Moose是否会改变这种行为。
package Class {
use Moose;
sub foo { 'test' }
}
package Extended::Class {
use Moose;
extends 'Class';
sub foo {
# do nothing
}
}
package main {
my $x = Class->new;
my $y = Extended::Class->new;
print $x->foo;
print $y->foo;
}