让方法不可行?

时间:2012-05-07 23:56:58

标签: perl moose

虽然重构我试图保留一些向后兼容性。我想知道是否有可能在对象上有一个方法,但是阻止该方法被子类化的类继承?例如给定

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;

不会。

我意识到这可能违反了某些原则,但我不得不弃用这些接口。

3 个答案:

答案 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;
}