6

私はムースと遊んでいて、それを感じ取っています。C ++のような純粋仮想関数の例を、Mooseの用語で(具体的にはC ++のように)例を挙げてください。SUPER::Mooseが通常のPerlよりも厳密なモデルを課している場合でも、(メソッド修飾子または呼び出しを介して)私が求めていることを実行する方法はまだ複数あります。そのため、可能な限りC++に似た実装を具体的に求めています。「なんで?」この制限の?主に好奇心がありますが、C++中心の人々がほとんど識別できる方法でMooseを使用してC++コードをPerlに移植することも計画しています。

4

4 に答える 4

5

サブクラス化の代わりにロールを使用して、このように考えることができます。

{
    package AbstractRole;
    use Moose::Role;
    requires 'stuff';  
}

{
    package Real;
    use Moose;
    with 'AbstractRole';
}

Realには定義されたものがないため、これによりコンパイルエラーが発生します。

Realにstuffメソッドを追加すると、機能するようになります。

{
    package Real;
    use Moose;
    with 'AbstractRole';

    sub stuff { print "Using child function!\n" }
}
于 2009-08-27T17:28:45.627 に答える
5

JesseLuehrsの MooseX::ABCもご覧ください。ここでの実装のいくつかと非常に似ているようです。あらすじから:

package Shape;
use Moose;
use MooseX::ABC;

requires 'draw';

package Circle;
use Moose;
extends 'Shape';

sub draw {
    # stuff
}

my $shape = Shape->new; # dies
my $circle = Circle->new; # succeeds

package Square;
use Moose;
extends 'Shape'; # dies, since draw is unimplemented

Jesseは日中C++プログラマーであることを私は知っています。

于 2009-08-27T20:46:12.017 に答える
2

Mooseでやりたいことを正確に行うことはできないようですが、Rolesに非常に近づくことができます。ロールのMooseマニュアルエントリからの情報は次のとおりです。

役割と抽象基本クラス

他の言語の抽象基本クラスの概念に精通している場合は、同じようにロールを使用したくなるかもしれません。

必要なメソッドのリストのみを含む「インターフェースのみ」の役割を定義できます。

ただし、この役割を使用するクラスは、直接または親からの継承を通じて、必要なすべてのメソッドを実装する必要があります。メソッド要件のチェックを遅らせて、将来のサブクラスで実装できるようにすることはできません。

ロールは必要なメソッドを直接定義するため、基本クラスをミックスに追加しても何も達成されません。そのインターフェイスを実装する各クラスのインターフェイスロールを単純に使用することをお勧めします。

于 2009-08-27T17:24:08.727 に答える
1

これが私の試みでした(役割なし、役割の詳細については他の回答を参照してください):

package Abstract;
use Moose;

sub stuff;

package Real;
use Moose;
extends 'Abstract';

override 'stuff' => sub { print "Using child function!\n"; }
于 2009-08-27T15:51:04.217 に答える