在用面向对象编程范式时,常用到类的继承。Perl的类使用Module的方式实现,一个package即可完成一个类声明。
CPAN上找到一个模块,使用了继承,本人从未使用过继承,这次也照猫画虎写了一个非常简单的demo,初步窥探了继承的实现过程。
环境:
Linux 3.18.0-kali3-amd64 x86_64 GNU/Linux
Perl v5.14.2 built for x86_64-linux-gnu-thread-multi
父类: Scalar, 子类: Phone
#!/usr/bin/perl
# author : ez
# date : 2015/7/21
# describe : --
package Phone;
use strict;
use warnings;
@Phone::ISA = 'Scalar'; # very important
# our $VERSION = 1.0;
sub new {
my $class = shift;
my ($_name, $_price, $_color) = (shift, shift, shift);
my $self = {
name => $_name,
price => $_price,
color => $_color
};
bless $self, $class;
$self;
}
sub sftr {
my $self = shift;
# foreach (@Phone::ISA) {
# print "$_\n";
# } # only print 'Scalar'
$self->SUPER::sftr ();
}
sub display {
my $self = shift;
print "name :". $self -> {'name'} .
", price :". $self -> {'price'} .
", color :". $self -> {'color'} . "\n";
}
1;
其中有一句代码非常重要,主要是声明其继承的是哪个类:
@Phone::ISA = 'Scalar';
父类的简单编写:
#!/usr/bin/perl
package Scalar;
use strict;
use warnings;
use Phone;
sub sftr {
print "this is Scalar::sftr";
}
my $my_phone = Phone -> new ('', '', '');
$my_phone -> sftr ();
Phone 继承了父类的方法。先看父类中调用子类的方法sftr (), 在子类中,调用了父类的sftr (), 只用这一句即可:
$self -> SUPER::sftr ();
SUPER即是Phone模块的符号表,其中添加了对Scalar类的继承,这句将执行父类的sftr () 方法。