这个问题与SUPER
类有关。
什么时候会出现“被覆盖的方法”?
所以当我实例化一个类时说:
$object = Classname -> new (some => 'values');
这就是你称之为被覆盖的方法吗?新方法的重写值?
如果是,那么为什么我要使用那个SUPER
类?
我可以说:
$object = Classname -> new ();
我再次使用原始方法。有人可以为我澄清一下吗?
答案 0 :(得分:3)
继承描述了父子关系。父母可以做的一切,孩子班也可以。 E.g。
ParentA ParentB
======= =======
foo() foo()
------- bar()
| -------
| /
Child
=====
此UML图表显示Child
继承自ParentA
和ParentB
,例如通过代码
package Child;
use parent "ParentA";
use parent "ParentB"
现在,Child
继承了来自foo
的{{1}}方法和来自ParentA
的{{1}}方法。
如果bar
本身定义ParentB
方法,Child
将调用此方法,而不父类的方法之一。然后说foo
方法是重写。
当子类化时,重用父类的构造函数通常很有用。但有时候,必须进行额外的处理。在这种情况下,子类想要提供不同的默认参数:
Horse.pm
Child->foo
SaddledHorse.pm
foo
注意package Horse;
use strict; use warnings;
sub new {
my ($class, %args) = @_;
return bless {
legs => 4,
saddled => 0,
%args,
} => $class;
}
1;
如何传播以将引用加入正确的类中。 package SaddledHorse;
use strict; use warnings;
use parent 'Horse';
# This override the inherited “new”
sub new {
my ($class, %args) = @_;
# the “SUPER” pseudo-package points to the parent
return $class->SUPER::new(%args, saddled => 1);
}
1;
包只能在定义继承关系的包中使用,并且可以说是有缺陷的。如果您需要$class
,通常需要使用Moose,其中明确表示覆盖的方法可以使用SUPER
函数调用super方法。
如果在包/对象上调用方法,则在运行时解析正确的方法。如果您查看继承图的答案的顶部,您可以看到SUPER
定义super
。如果我们在ParentB
上调用bar
方法,则会查找该方法
bar
,Child
和Child
中找到它。这称为“方法解析”,本身就是一个棘手的问题。
如果我们传递一个完全限定的子程序名称作为方法,则不会发生解析,并直接调用该子程序。例如。 ParentA
会将方法解析为ParentB
,因此调用大致等于Child->foo
。如果我们做的话
ParentA::foo
我们得到了ParentA::foo("Child")
的效果。 Child->ParentB::foo();
的语法是多余的,但提醒我们,我们在对象上使用方法。因此,我更愿意写
ParentB::foo("Child")
<{1>}示例中的,即使这只是
的详细语法->
解析为
$class->SUPER::new(%args, saddled => 1)
答案 1 :(得分:2)
你有更多的背景吗?它可能指的是在子类中重写的方法。
e.g。
use feature 'say';
package A;
sub foo {
say "A";
}
package B;
use base 'A';
# this is overriding 'foo' in A.
sub foo {
my $class = shift;
$class->SUPER::foo(); # calls A->foo(), but this is optional
say "B";
}
B->foo(); # prints "A" then "B"
SUPER :: foo的调用是可选的 - 该方法可以覆盖foo
并替换它的行为或通过在SUPER :: foo之前或之后的工作来扩充它。
更现代的OO perl(例如使用Moose,Moo等)使其更具可读性 - 调用诸如“覆盖”,“之前”,“之后”,“围绕”等功能来改变继承的方法