• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlの継承について)

Perlの継承について

このQ&Aのポイント
  • クラスSubclassはクラスBaseclassを継承し、myfunc1をオーバーライドしています。
  • Subclassのmyfunc1を呼び出す方法はありますか?Baseclassのmyfunc1を呼び出す方法を教えてください。
  • Baseclassのmyfunc2内の$self->myfunc1(...)の記載をBaseclass::myfunc1($self, ...)に変更することで、Baseclassのmyfunc1を呼び出せる可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

そういうことなら仕様です。 {   package BaseClass;   sub func1 { print "BaseClass::func1", $/ }   sub func2 {     my $self = shift;     print "BaseClass::func1", $/;     print '$self = ', ref($self), $/;     func1($self);   } } {   package SubClass;   use base qw(BaseClass);   sub new {     my $class = shift;     bless {}, $class;   }   sub func1 { print "SubClass::func1", $/ } } my $sub = SubClass->new(); $sub->func2(); 上のコードを実行すると BaseClass::func1 $self = SubClass BaseClass::func1 となります。 データとblessされたパッケージ名がSubClassなので、SubClassから関数を探します。ただし、上の例で書いてあるとおりBaseClassの関数を呼ぶ場合は、func1($self)でOKです。 無理にやろうとすれば、一旦blessされたパッケージ名をBaseClassに変えてからfunc2()を呼ぶという方法もあります。わかりづらいので、避けたほうがよいでしょう。 my $sub = SubClass->new(); my $base = bless $sub, 'BaseClass'; $base->func2(); $sub = bless $base, 'SubClass';

nshoes
質問者

お礼

おそくなりすいません。回答ありがとうございます。参考にさせてもらいます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

Baseclass::myfunc1($self, ...)でもできますが、普通はSUPERを使います。 空白を全角にして書いていることに注意 {   package BaseClass;   sub func1 {print "BaseClass::func1", $/} } {   package SubClass;   our @ISA = qw(BaseClass);   sub func1 {print "SubClass::func1", $/}   sub func2 {     my ($self) = @_;     print "SubClass::func2", $/;     $self->SUPER::func1();   } } SubClass->func2();

nshoes
質問者

お礼

ご回答ありがとうございます。 SubclassからBaseclassの関数を呼び出す際はSUPERを使用するという事は理解しています。ありがとうございます。 今回は、 1. Subclassのインスタンスを生成 2. SubclassのインスタンスからBaseclassにて実装されているmyfunc2を実行 3. myfunc2内にて記載されるmyfunc1が呼び出される 4. myfunc1はBaseclassで実装されるものを呼び出してほしいが、Subclassでオーバーライドしたものが呼び出される となっており、上記4にて困っております。 コード 1. my $obj = Subclass->new() 2. $obj->myfunc2() 3. $self->myfunc1() #←これはBaseclass内で、myfunc2内に記載されているコード 本来、親クラスから呼び出されたならば、親クラスのmyfunc2が呼び出されるべきだと思うのですが、perlの継承の仕様上しょうがないのかな(?)と思っております。 何かあればツッコミお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A