2009-08-27 5 views
6

私はMooseを使って遊んでいました。私はC++のような純粋な仮想関数の例を望んでいますが、Mooseの言葉では(特にC++のように見えます)。私はMooseが通常のPerlよりも厳しいモデルを課しても、私が求めていることを行う方法はまだ複数あることを知っています(メソッド修飾子またはSUPER::呼び出しを介して)。そのため、私はC++に似た実装をできるだけ具体的に求めています。 "なぜ?"この制限の? C++中心の人々がほとんど可能な方法で、Mooseを使ってPerlにいくつかのC++コードを移植することを計画しています。ほとんどはとなります。ここでOOPのためのPerlを使ったC++のような使い方

+0

質問から回答セクションに移動しました。 –

+1

Yikes、この質問はPerlでMooseを使った純粋な仮想関数のためのグーグルグーグルではすでに3番目の反応です。興味のある人は、これに関連するperlmonksのディスカッションはここにあります:http://www.perlmonks.org/?node_id=742013そこには具体的な答えがないようです。 –

+0

おそらく、C++プログラマー以外の誰もがそれらを「メソッド」と呼ぶからです。 – jrockway

答えて

5

私の代わりにサブクラス化の役割を使用して、この方法を考えることができます。

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

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

実がもの定義されていないので、これはコンパイルエラーになります。実際にものメソッドを追加する

は今、それを動作させるだろう。

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

    sub stuff { print "Using child function!\n" } 
} 
+0

ええ、これは私がインターフェイスだけを望んでいたらどうなるかです。私は、私が望んでいることを正確に行うことができないかもしれないことを、ここでの研究と議論を通じて知っています。 –

+0

私はこれがあなたのほとんどを得ると思う。これをさらに拡張する利点があると思えば、irc.perl.orgの#mooseまたは[email protected]のメーリングリストとチャットしてください。 – draegtun

+0

@draegtunええ、私はこれが私が願っている最高の近似だと思います。ご協力いただきありがとうございます! –

1

は私の試み(役割なしに、役割の詳細については、他の回答を参照)であった。

package Abstract; 
use Moose; 

sub stuff; 

package Real; 
use Moose; 
extends 'Abstract'; 

override 'stuff' => sub { print "Using child function!\n"; } 
+0

あなたは何を言っているのか分かりませんが、 'Abstract'を抽象基本クラスにし、' stuff'メソッド(関数ではない)を純粋な仮想にしたいようです。 'sub stuff {}'と書くだけで直ちにそれに違反します。ですから、基本クラスのメソッドは 'sub stuff {croak}'でなければなりません。 –

+0

@Sinan私はC++のようなものに行きました:virtual void stuff()= 0; –

+0

@Sinan私は、私にとってコンパイルされなかった、2)あなたがクルックが実装の一形態であると主張することができる、(私が純粋な仮想関数の定義を誤解していない限り)は私がやっていることの正反対です。私はサブのものを編集しています{; }サブものにする; –

2

私が、私はムースにしたい正確に何を行うことはできません表示されますが、私は非常に近くに来ることができますロールと。あなたが他の 言語の抽象ベースクラスの概念 に精通している場合、あなたは誘惑される抽象基底クラス

役割:ここではロールのムースマニュアルentryからの情報があります同じ方法で ロールを使用します。

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

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

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

+0

スナップ!あなたの答えは私が私のことをきちんと整頓していたときに現れた;-) – draegtun

+0

@draegtunそれはどうしたのかおかしい!あなたの答えは本当に役に立ちます。特に、Mooseでインターフェースを実装しようとする人にとっては便利です。私は、さらなる研究を通して私が決定論的な答えを持っていないかもしれないという奇妙な質問を思いつきました。私は依頼する前に領域を完全に理解できなかったか、またはMooseがこの機能を欠いているかどうかを判断するためにまだ試みています; –

+2

Hmm。それは私だけですか、それとも実際に役に立たないのですか? 「同じことではないため、機能しないロールで抽象クラスを実装したい場合は、代わりに、そこを見て、飛ぶ豚*!私はまだ、(a)抽象クラスの階層をどうやって行うのですか(特にMooseX :: ABCが良いと思われるかどうか)、あるいは(b)ABCがMooseプログラムに悪い理由です。 – ijw

5

あなたはまた、ジェシーLuehrs' 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++プログラマーであることを知っています。

+0

チップをありがとう、私は間違いなくそれをチェックします! –

+0

リンクをバージョン0.20を指すように更新しました。バージョン0.30では、抽象クラスを持つ抽象基本クラスのサブクラス化を追加しました。 – spazm

関連する問題