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 に答える