Say Critter 是没有定义 find
或 display
的子类 。 信件不是一对一, 因为硬联线子电话不会像 perlobj 文件所解释的那样进行方法搜索 。
Perl 怎么知道子例程在哪个包件中? 通过查看箭头左侧, 它必须是包件名称或对象的引用, i. e. em >, 是包件的特惠。 不论哪种方式, 包件是 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.