興味深い。私はこれがどのように相続に影響を与えるか考えている。
と_step2
メソッドをオーバーライドするUtil
クラスの子クラスを想像してください。そのクラスがdowork
メソッドを呼び出した場合子クラス '_step1
と_step2
メソッドを呼び出すのではなく、親クラス' _step1
と_step2
メソッドを呼び出すことになります。
補遺
関数呼び出しは、継承を無視します。モジュールは、継承のためにUtil - > _ step1()またはパッケージ - > _ step1()のような処理をする必要があり、パッケージ検索は子クラスではなくUtilで始まります。 - Ven'Tatsu
本当に?テストするのに十分シンプルだと思われる。
私のプログラムには、Local::Util
とLocal::Util::Child
という2つのパッケージがあります。 Local :: Util :: Childは子クラスでLocal::Util
です。
クラスLocal::Util
は、定義された以下のコンストラクタとメソッドを持っています
new
:
_step1
_step2
doWork
そのクラスの新しいオブジェクトを作成します。これはUtil::
と_step1
と_step2
を呼び出します接頭辞。
doWork2
:_step1
と_step2
は、Util::
というプレフィックスを付けずに呼び出します。
doWork3
:これは、接頭辞__PACKAGE__
の_step1
と_step2
を呼び出します。
doWork4
:これは、と_step2
と呼ばれ、接頭辞はから取られた$class
です。
クラスLocal::Util::Child
は、_step2
メソッドを再定義します。
は、ここでプログラムです:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
# This is our basic Local::Util object manipulation
my $util_obj = Local::Util->new;
say q("$util_obj" is a member of the ") . ref($util_obj) . q(" class);
print q($util_obj->_step1:);
$util_obj->_step1;
print q($util_obj->_step2:);
$util_obj->_step2;
# This is a child class object of the above
my $uc_obj = Local::Util::Child->new;
say q("$uc_obj" is a member of the ") . ref($uc_obj) . q(" class);
# Calls to straight forward methods
print q($uc_obj->_step1:);
$uc_obj->_step1;
print q($uc_obj->_step2:);
$uc_obj->_step2;
# Now calls to methods that call other methods
say qq(\n=====\$util_obj->doWork=====);
$util_obj->doWork;
say qq(\n=====\$uc_obj->doWork=====);
$uc_obj->doWork;
say qq(\n=====\$util_obj->doWork2=====);
$util_obj->doWork2;
say qq(\n=====\$uc_obj->doWork2=====);
$uc_obj->doWork2;
say qq(\n=====\$util_obj->doWork3=====);
$util_obj->doWork3;
say qq(\n=====\$uc_obj->doWork3=====);
$uc_obj->doWork3;
say qq(\n=====\$util_obj->doWork4=====);
$util_obj->doWork4;
say qq(\n=====\$uc_obj->doWork4=====);
$uc_obj->doWork4;
###################################################
# Package Local::Util
#
package Local::Util;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
}
sub _step1 {
say "I'm calling Local::Util::_step1";
}
sub _step2 {
say "I'm calling Local::Util::_step2";
}
sub doWork {
Local::Util::_step1();
Local::Util::_step2();
}
sub doWork2 {
_step1();
_step2();
}
sub doWork3 {
__PACKAGE__->_step1();
__PACKAGE__->_step2();
}
sub doWork4 {
my $self = shift;
my $class = ref $self;
$class->_step1();
$class->_step2();
}
#
#############################################
#############################################
# Package Local::Util::Child
#
package Local::Util::Child;
use base qw(Local::Util);
sub _step2 {
say "I'm calling Local::Util::Child::_step2";
}
そして、ここでの出力です:興味深い
"$util_obj" is a member of the "Local::Util" class
$util_obj->_step1: I'm calling Local::Util::_step1
$util_obj->_step2: I'm calling Local::Util::_step2
"$uc_obj" is a member of the "Local::Util::Child" class
$uc_obj->_step1: I'm calling Local::Util::_step1
$uc_obj->_step2: I'm calling Local::Util::Child::_step2
=====$util_obj->doWork=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$uc_obj->doWork=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$util_obj->doWork2=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$uc_obj->doWork2=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$util_obj->doWork3=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$uc_obj->doWork3=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$util_obj->doWork4=====
I'm calling Local::Util::_step1
I'm calling Local::Util::_step2
=====$uc_obj->doWork4=====
I'm calling Local::Util::_step1
I'm calling Local::Util::Child::_step2
。私がUtil::
プレフィックスを付けるかどうかにかかわらず、それは何の違いもなく、子メソッドではなく親メソッドを呼び出すのは間違いありません。 __PACKAGE__
接頭辞を置くことは同じです(私はあなたが現在のクラスの定義を呼び出すことを確実にするためにそれをやっていると思いました)。私が子供に働かせる唯一の方法は、ref
コマンドから取得しなければならない接頭辞$class
を使用することです。
他のメソッドでメソッドを呼び出すと、デフォルトでそのクラスのメソッドであり、子のメソッドではありません。私はこれが理にかなっていると思う - 特に_step1
と_step2
のように見えるので、親メソッドの外でアクセスすべきではないプライベートメソッドです。
明確にするために、私は既存のプロジェクトに割り当てられていることを伝える目的で、「継承」を使用しました。 – jgrump2012