2009-09-06 9 views
13

私はあなたがスーパークラスのメソッドを呼び出すとき、あなたはこのような何かをする必要があることに気づい:なぜPerlのSUPER呼び出しで矢印メソッドを使用しないのですか?

my $self = $class->SUPER::new(); 

なぜそれがありません:

my $self = $class->SUPER->new(); 
+1

Geo、Perlでオブジェクトの根ざした詳細を学びたい場合は、Damian ConwayのObject Oriented Perlのコピーを手に入れてください。http://www.manning.com/conway/ PerlのOOP機能を使用する。基本的な祝福されたハッシュから動的なメソッド生成、祝福されたコードリーダーのようなエキゾチカに至るまで、あらゆるものがあります。それは非常によく書かれた本です。しかし、ムースをチェックしてください。多くの人にとって、ほとんどではないにしても、MooseはPerl OOPを行う正しい方法です。 – daotoad

答えて

14

$class->SUPER->new()は通常と同じになるので、私は疑います$class->SUPER()->new()。しかし、$class->SUPER()関数は存在せず、その関数が何を返すのか明確ではありません。

一方、$class->Foo::Barは、メソッドを直接フルネームで呼び出す有効な方法でした。したがって、特別なパッケージのようなもの(SUPER)を適切に組み込んでください。 (私はあなたが実際にパッケージとしてSUPERを実装することができることを疑い、そして多分それは歴史的だった、私は知らない)

PS:mroパッケージを見てみましょう、と$self->next::method。また、Perlで深刻なオブジェクト指向の作業を行う場合は、Mooseを見てください。

あなたは「SUPER」名前空間の「新しい」呼び出しが、それをオブジェクト(または文字列)を渡している、「$クラス」:derobertが言ったことに追加するには

+9

私はムースを使用する前に、後ろのものを理解したい。 – Geo

+3

チェックアウト_A Gentle Introduction to Moose_ http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html –

+2

@Geo、あなたはもっと知りたいと思います。私は正直言って、あなたがそれを知る前にあなたがそれを知らない方が良いということを伝えることができます。 –

7

あなたはあなたは(ダイヤモンド継承の場合に有効)親の完全なパッケージ名を与えることができますよう、SUPERを使用するを持っていない:

sub init { 
    my $self = shift; 
    $self->ParentClass1::init(); 
    $self->ParentClass2::init(); 
} 
+3

他のトリビア:実際に '$ self-> TotallyUnrelatedClass :: init()'を実行することはできますが、それはおそらく最善ではありません! – derobert

13

メソッドの呼び出しがフォームの数を持っています:

可能性が継承された呼び出し方法、:

->method() 

が明示的にサブパッケージを呼び出す::方法、それは継承ツリーにありますかどうかない:

->Package::method() 

は、明示的に呼び出すと呼ば-にサブ、それは継承ツリーにありますかどうか:

->$coderef() 

はには、サブ方法がなかった場合__PACKAGE__->method()で呼ばれていたであろうメソッドを呼び出します__PACKAGE__(NB ->の左側のクラスまたはオブジェクト)は無関係である。

->SUPER::method() 

$methodの内容に応じて、上記のいずれか:

->$method() 

(リーガルもuse strict;下)

。最初のフォームが最も一般的ですが、他のフォームやその仕組みについて学習する価値があります。

13

つまり、SUPERは方法ではありません。これは仮想パッケージです。これはperlobjの「メソッド呼び出し」セクションに記載されています。

ただし、SUPERは、使用しているインスタンスのパッケージではなく、現在のパッケージに基づいています。

関連する問題