Say Critter是一個子類,它沒有定義find
或display
或兩者!函數不是一對一的,因爲硬連線的子調用不執行方法查找,正如perlobj文檔解釋的那樣。
Perl如何知道子程序在哪個包中?通過查看箭頭的左側(其必須是包名或對對象的引用),,即,這是一種已被祝福的包。無論哪種方式,這是Perl開始尋找的包。如果該包沒有該名稱的子例程,Perl就會開始在該包的任何基類中查找它,等等。
用一個子,你必須確切地知道它是靜態的,或者你的程序將會是die
。要調用方法,只需指定從哪裏開始搜索它。
例如:
#! /usr/bin/env perl
package Critter;
sub new { bless {}, shift }
sub display { ref($_[0]) . " display" }
package SuperCritter;
@SuperCritter::ISA = qw/ Critter /;
package main;
my $super = SuperCritter->new;
# one of these things is not like the other
warn $super->display;
warn Critter::display($super);
warn SuperCritter::display($super);
輸出:
SuperCritter display at ./call-demo line 14.
SuperCritter display at ./call-demo line 15.
Undefined subroutine &SuperCritter::display called at ./call-demo line 16.
「撇開錯誤檢查,以確保第一個參數是一個幸福的對象或有效的類名」 - 這是一個相當大的財產放在一邊,不是嗎? – Mat
@Mat - 正確。由於其顯而易見性,我沒有把它放在外面,而不是因爲缺乏重要性。 – DVK