2

スーパークラスからメソッドを呼び出すサブクラスがあります。スーパークラスのメソッドは、スーパークラスで抽象(実際には抽象ではない)として定義されているが、サブクラスに実装されているメソッドを使用します。

例えば:

package BaseClass;

sub new
{

}
sub method1 {

    return someAbstractMethod();
}



sub someAbtsractMethod
{
     die "oops, this is an abstract method that should " . 
         "be implemented in a subclass" ;
}
1;

package SubClass;

sub new
{

}

sub someAbtsractMethod
{
     print "now we implement the asbtract method";
}
1;

今私がするとき:

$sub = new SubClass();
$sub->method1();

...抽象メッセージを呼び出し、指定されたエラーメッセージを受け取ります。スーパークラスから抽象メソッドを削除し、実装をサブクラスのままにすると、メソッドが認識されず、サブルーチンの抽象メソッドが見つからないというエラーが発生します。

4

4 に答える 4

6

親クラスと子クラスの間にIS_A関係を設定していません。

baseIvanが提案するように、プラグマを使用してこれを行うことも、@ISA配列を操作することもできます。parentまたは、プラグマを使用できます。

@ISA:

package SubClass;
our @ISA = qw( BaseClass );

parent

package SubClass;
use parent qw( BaseClass );

ちなみに、間接目的語構文は絶対に使用しないでください。コンストラクターを呼び出すには、次のようにします。

私の$foo= SubClass-> new();

また、strictおよびwarningsプラグマを使用していないようです。そうする。いつも。

最後に、1つのファイルに複数のパッケージがある場合は、各パッケージを1つのブロックで囲むと便利です。

perlbootperltootをチェックしてください。これらはperldocの便利なOOPチュートリアルです。

アップデート:

メソッド呼び出しが壊れていることに気づきました。各メソッドで呼び出し元のクラスまたはインスタンスを見つける必要があります。

package BaseClass;

sub new { bless {}, shift; }  # horrible constructor - do not reuse.

sub abstract { die "The present situation is abstract"; }

sub method { my $self = shift; $self->abstract; }


package SubClass;

our @ISA = qw( BaseClass );

sub abstract { print "It's alive\n" );

スクリプト内:

my $obj = SubClass->new;
$obj->method;

my $base = BaseClass->new;
$base->method;

リンクしたチュートリアルを必ず読んでください。彼らはあなたを助けます。

于 2010-04-08T16:24:02.737 に答える
3

基本的な問題は、メソッド呼び出しをまったく使用していないことです。やった?

sub method1 {
  my $self = shift;
  $self->someAbstractMethod();
}

基本クラスで(そして継承が適切に設定されていると仮定して)、物事は機能します。ただしsomeAbstractMethod()、メソッド呼び出しではなく関数呼び出しであると書くと、ポリモーフィズム(オブジェクトのタイプ)に関係なく、コンパイル時にすぐに解決されます。

于 2010-04-08T17:17:27.113 に答える
3

コードにいくつかの問題があります。サブクラスにその親クラスが何であるかを伝える必要があります。また、親クラスに渡すようにコンストラクターを設定する必要もあります。そこにはいくつかのスペルミスもありました。

package BaseClass;

sub new {
    bless {} => shift;
}
sub method1 {
    my $self = shift;

    return $self->someAbstractMethod();
}


sub someAbstractMethod
{
     die "oops, this is an abstract method that should " . 
         "be implemented in a subclass";
}


package SubClass;
use base 'BaseClass';

sub new {
    shift->SUPER::new
}

sub someAbstractMethod
{
     print "now we implement the asbtract method\n";
}


package main;

my $obj = BaseClass->new;

eval {$obj->method1(); 1} or warn $@;

my $subobj = SubClass->new;

$subobj->method1();
于 2010-04-08T16:28:48.547 に答える
2

Perl OOを使い始めたばかりの場合は、Mooseをチェックすることを忘れないでください。Mooseと通常のPerl5OOPスタイルの比較については、Moose :: Manual::Unsweetenedも参照してください。

于 2010-04-08T16:32:10.060 に答える