8

#child.pm

#!/usr/bin/perl
package child1;
use strict;
use warnings;
use Exporter;
use parent;
my @ISA=qw(cal Exporter);
sub new{
        my $class=shift;
        my $ref=cal->new();
        bless ($ref,$class);
        return $ref;
        }
sub add{
        my $ref=shift;
        print "This is from child class";
        my($a,$b)=@_;
        return ($a+$b); 
        }

# #parent.pm

#!/usr/bin/perl
package cal;
use strict;
use warnings;
use Exporter;
my @EXPORT=qw(add);
my @ISA=qw(Exporter EXPORT);
sub new{
        my $class=shift;
        my $ref=[];
        bless ($ref,$class);
        return $ref;
        }

sub add{
        my $ref=shift;
        my $a=shift;
        my $b=shift;
        return ($a+$b);
        }
1;

#test.pl

#!/usr/bin/perl
use strict;
use warnings;
use Exporter;
use child;
my @ISA=qw(child1 Exporter);
my $obj=new child1();
my $sum=$obj->add(1,2);
print "$sum=sum";

Can't locate object method "add" via package "child1" at ./test.pl 行 8 というエラーが表示されます。基本クラスの add メソッドにアクセスしたいのですが、上記のエラーが表示されます 。

どうか明らかにしてください..

4

3 に答える 3

10

ここでの主な原因はmy @ISA. 継承を機能させるには、パッケージを使用する必要があります@ISA( で宣言しますour)。

ただし、コードにはそれ以外の問題がいくつかあります。

  1. use parent 'cal'自分を操作する代わりにお願いし@ISAます。
  2. オブジェクト指向モジュールを使用する理由はほとんどありませんExporter
  3. 親のものは継承されているため、子1のものは再ブレンシングnewなしで書き込むことができます。newinheritednewは、継承を既にサポートしている方法で記述されています。
  4. モジュールに小文字の名前を付けないでください。これらは「プラグマ」用に予約されています。モジュールは既に存在し、最初のparentポイントで使用しました。
于 2013-07-24T12:06:59.663 に答える