Perl中的重写方法是什么?
这个问题是关于Perl中的重写方法是什么?,perl,oop,Perl,Oop,这个问题是关于SUPER类的 什么时候会发生“重写方法” 因此,当我实例化一个类时: $object = Classname -> new (some => 'values'); 这就是所谓的重写方法吗?新方法的重写值 如果是这样,我为什么要使用SUPER类 我只能说: $object = Classname -> new (); 我又有了原来的方法。有人能帮我澄清一下吗?你有更多的背景吗?它可能是指在子类中重写的方法 e、 g 调用SUPER::foo是可选的-该方法可以
SUPER
类的
什么时候会发生“重写方法”
因此,当我实例化一个类时:
$object = Classname -> new (some => 'values');
这就是所谓的重写方法吗?新方法的重写值
如果是这样,我为什么要使用SUPER
类
我只能说:
$object = Classname -> new ();
我又有了原来的方法。有人能帮我澄清一下吗?你有更多的背景吗?它可能是指在子类中重写的方法 e、 g 调用SUPER::foo是可选的-该方法可以覆盖
foo
并替换它的行为,或者通过在SUPER::foo之前或之后执行工作来增强它
更现代的OO perl(例如,使用Moose、Moo等)使其更具可读性—通过调用诸如“override”、“before”、“after”、“around”等功能来改变继承的方法继承描述了父子关系。父母能做的一切,孩子们也能。例如
ParentA ParentB
======= =======
foo() foo()
------- bar()
| -------
| /
Child
=====
此UML图显示Child
继承自ParentA
和ParentB
,例如通过代码
package Child;
use parent "ParentA";
use parent "ParentB"
现在,Child
从ParentA
继承了方法foo
,从ParentB
继承了bar
如果Child
定义了foo
方法本身,Child->foo
将调用此方法,而不是父类的方法之一。然后说覆盖了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
是如何传播的,以便将引用传递到正确的类中。SUPER
包仅在定义继承关系的包中可用,可以说是已损坏的。如果需要SUPER
,通常需要使用Moose,其中明确表示要重写的方法可以使用SUPER
函数调用SUPER方法
编辑:关于完全限定方法名称的注释
如果对包/对象调用方法,则在运行时解析正确的方法。如果您查看继承图答案的顶部,您可以看到ParentB
定义bar
。如果我们对子对象
调用条
方法,则会查找该方法
子项中
Child->foo
将方法解析为ParentA::foo
,因此该调用将大致等于ParentA::foo(“Child”)
。如果我们这样做
Child->ParentB::foo();
我们得到了ParentB::foo(“Child”)的效果。->
的语法是多余的,但它提醒我们,我们在某种程度上是在对象上使用方法。因此,我更喜欢写作
$class->SUPER::new(%args, saddled => 1)
在SaddledHorse
示例中,即使这只是针对
# SUPER::new($class, %args, saddled => 1) # pseudocode, won't actually run
决定
Horse::new($class, %args, saddled => 1)
不,这完全不是它-任何答案基本上都会重复。你从中学到了什么?可能有更好的书/教程/网站等适合你。在您更熟悉基本的OO概念和子类化(编辑、oh和方法参数)之前,您不应该真正需要“SUPER::”!你不会因为在一个问题上获得否决票而被禁止。不管怎样,我想这可能是一本不错的书。在下有一个方法重写的示例。“这不是你想象的那样。@BelmarkCaday-否决票本身并不会让人被禁止(尽管如果你发布100个问题,每个问题-5个,那可能)。它们表明人们不喜欢你问题的质量——基本上,你不是问有趣的编程问题,而是让人们向你解释OOP 001(甚至不是101)的基本原理;似乎没有自己做任何研究(你有没有谷歌“子类/超类/OOP”?)。是的,获得太多的反对票可能会导致人们对回答你的问题失去兴趣,甚至是那些更有趣的问题(你确实有这些问题)重复我对你的第一个问题所做的第一次评论,你会从阅读OOP的总体情况(至少是一篇维基文章或一本好书)中获益匪浅,然后从一个更基本的Perl材料开始(甚至可能学习Perl而不是编程,根据这个问题的评论链接,至少还有一些关于perldoc的文档)。我相信我正处于一个叫做学习曲线的阶段。谢谢谢谢。我能不能说在里面
saddledhose.pm
Horse->new(%args,saddled=>1)代码>?这是一个非常复杂的例子。不需要多重继承Base::foo
和Child::foo
就足够了。@BelmarkCaday是的,这个例子不好,但我想说明一个子类可以有不同的默认值。一个更好但更复杂的例子可能涉及GUI编程MyFrame
可以继承自Frame
,例如,指定了默认标题和布局。@DVK它与Perl无关。在类型理论中,它通常用作关系。Ruby使用
Horse::new($class, %args, saddled => 1)