私はムースと遊んでいて、それを感じ取っています。C ++のような純粋仮想関数の例を、Mooseの用語で(具体的にはC ++のように)例を挙げてください。SUPER::
Mooseが通常のPerlよりも厳密なモデルを課している場合でも、(メソッド修飾子または呼び出しを介して)私が求めていることを実行する方法はまだ複数あります。そのため、可能な限りC++に似た実装を具体的に求めています。「なんで?」この制限の?主に好奇心がありますが、C++中心の人々がほとんど識別できる方法でMooseを使用してC++コードをPerlに移植することも計画しています。
4 に答える
サブクラス化の代わりにロールを使用して、このように考えることができます。
{
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" }
}
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++プログラマーであることを私は知っています。
Mooseでやりたいことを正確に行うことはできないようですが、Rolesに非常に近づくことができます。ロールのMooseマニュアルエントリからの情報は次のとおりです。
役割と抽象基本クラス
他の言語の抽象基本クラスの概念に精通している場合は、同じようにロールを使用したくなるかもしれません。
必要なメソッドのリストのみを含む「インターフェースのみ」の役割を定義できます。
ただし、この役割を使用するクラスは、直接または親からの継承を通じて、必要なすべてのメソッドを実装する必要があります。メソッド要件のチェックを遅らせて、将来のサブクラスで実装できるようにすることはできません。
ロールは必要なメソッドを直接定義するため、基本クラスをミックスに追加しても何も達成されません。そのインターフェイスを実装する各クラスのインターフェイスロールを単純に使用することをお勧めします。
これが私の試みでした(役割なし、役割の詳細については他の回答を参照してください):
package Abstract;
use Moose;
sub stuff;
package Real;
use Moose;
extends 'Abstract';
override 'stuff' => sub { print "Using child function!\n"; }