12.5.2 访问被覆盖的方法
来源:互联网 发布:软考程序员内容 编辑:程序博客网 时间:2024/04/28 23:27
12.5.2 访问被覆盖的方法当一个类定义一个方法,那么该子过程覆盖任意基类中同名的方法。想象一下你有一个Mule(骡)对象(它是从Horse(马)类和Donkey(驴)类衍生而来的)$stallion = Horse->new(gender => "male"); 男性$molly = Mule->new(gender => "female"); 女性$colt = $molly->breed($stallion);这就是SUPER 伪类提供便利的地方,它令你能够调用一个覆盖了的基类方法,而不用声明哪个类定义了该方法。[root@node01 aaa]# cat Horse.pm package Horse; our @ISA = "Critter"; require Critter; sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, # 覆盖以前的属性 }; return bless $self, $class; #return $self; }; sub sum1 { $self=shift; my $a=shift; my $b=shift; return $a + $b + 7; }; sub kick { my $self=shift; $self->SUPER::kick(@_); }; 1; Horse 类继承了Critter 类[root@node01 aaa]# cat Critter.pm package Critter; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum2 { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; sub fun1 { $self=shift; my $a=shift; my $b=shift; return $a / $b; } sub kick { my $self=shift; my $a=shift; my $b=shift; return $a / $b +66; } 1; [root@node01 aaa]# cat a1.pl use Horse; use Data::Dumper; $steed = Horse->new(color => "dun"); print $steed->kick(12,4); print "\n"; [root@node01 aaa]# perl a1.pl 69此时调用了Critter.pm 类的kick 方法:[root@node01 aaa]# cat Critter.pm package Critter; our @ISA = "Mule"; require Mule; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum2 { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; sub fun1 { $self=shift; my $a=shift; my $b=shift; return $a / $b; } sub kick { my $self=shift; my $a=shift; my $b=shift; return $a / $b +66; } 1; 让 Critter 继承Mule 类[root@node01 aaa]# cat Mule.pm package Mule;sub kick { my $self=shift; my $a=shift; my $b=shift; return $a * $b +66; } 1;[root@node01 aaa]# perl a1.pl 69修改[root@node01 aaa]# cat Critter.pm package Critter; our @ISA = "Mule"; require Mule; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum2 { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; sub fun1 { $self=shift; my $a=shift; my $b=shift; return $a / $b; } sub kick { my $self=shift; $self->SUPER::kick(@_); }; 1;[root@node01 aaa]# cat a1.pl use Horse; use Data::Dumper; $steed = Horse->new(color => "dun"); print $steed->kick(12,4); print "\n"; [root@node01 aaa]# perl a1.pl 114当一个类定义一个方法,那么该子过程覆盖任意基类中同名的方法:[root@node01 111]# cat Horse.pm package Horse; our @ISA = "Critter"; require Critter; sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; my $self = { color => "bay", legs => 4, owner => undef, @_, # 覆盖以前的属性 }; return bless $self, $class; #return $self; }; sub sum1 { $self=shift; my $a=shift; my $b=shift; return $a + $b + 7; }; sub kick { my $self=shift; my $a=shift; my $b=shift; return $a * $b;}; 1; [root@node01 111]# cat Critter.pm package Critter; our @ISA = "Mule"; require Mule; sub new { my $self = {}; my $invocant = shift; my $class = ref($invocant) || $invocant; my ($name)=@_; my $self = { "name" =>$name }; bless $self, $class; # Use class name to bless() reference return $self; }; sub sum2 { $self=shift; my $a=shift; my $b=shift; return $a + $b; }; sub fun1 { $self=shift; my $a=shift; my $b=shift; return $a / $b; } sub kick { my $self=shift; my $a=shift; my $b=shift; return $a/$b +5;}; 1; [root@node01 111]# cat a1.pl use Horse; use Data::Dumper; $steed = Horse->new(color => "dun"); print $steed->kick(12,4); print "\n"; [root@node01 111]# perl a1.pl 48此时没有去访问基类的方法:Mule (骡)类的设计者通过给 Mule(骡)类写自己的 breed 方法覆盖了那些父类的 breed 方法。这这意味着下面的交叉引用可能不能正确工作:$stallion = Horse->new(gender => "male"); 男性$molly = Mule->new(gender => "female"); 女性$colt = $molly->breed($stallion);
阅读全文
0 0
- 12.5.2 访问被覆盖的方法
- javascript之调用被覆盖的方法
- 构造方法中不应调用可被覆盖的方法
- 方法可以被覆盖,但是属性不会被覆盖
- 构造器决不能调用可被覆盖的方法
- Java静态方法不能被覆盖
- Java 方法被覆盖时异常特点
- 恢复被覆盖的linux引导
- 恢复被覆盖的存储过程 oracle
- 求区间没被覆盖的点
- 解决grub被覆盖的问题
- eclipse取回被覆盖的代码
- oracle恢复被覆盖的存储过程
- 如何 恢复被覆盖的文件
- 被覆盖了的文件怎么恢复
- log4j配置内容被覆盖的解决办法
- Listview最后一行被覆盖的bug
- oracle 恢复被覆盖的存储过程
- 对recyclerview的简单封装
- bootstrap学习15---辅助类2
- androidStudio出现Executing tasks: [:app:assembleDebug]等错误不能运行程序
- YII2___ActiveForm组件使用
- Apache与Nginx优缺点比较
- 12.5.2 访问被覆盖的方法
- ios一些大神的博客地址
- 恢复出厂设置
- Floyd算法-天梯地图.cpp
- Sublime Text 3 项目
- jQuery百家姓验证
- 操作系统的功能与特征
- java enum(枚举)
- Spring+Spring MVC+Mybatis+Maven搭建多模块项目(二)