1

在重构时,我试图暂时保留一些向后兼容性。我想知道是否可以在对象上有一个方法,但防止该方法被继承它的类继承?例如给定

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;

不会。

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

4

3 回答 3

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;
}
于 2012-05-08T00:36:09.927 回答
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如果必须,您可以覆盖)。根据用例,将原始参数传递给您正在扩展的对象可能会很烦人。

于 2012-05-08T19:49:38.723 回答
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;
}
于 2012-05-08T07:02:58.200 回答