Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中的重写方法是什么?_Perl_Oop - Fatal编程技术网

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
。如果我们对
子对象
调用
方法,则会查找该方法

  • 子项中
  • 在家长A中,以及
  • 在父项B中找到它
  • 这被称为“方法解析”,其本身就是一个棘手的问题

    如果我们传递一个完全限定的子例程名称作为方法,则不会进行解析,并且直接调用子例程。例如,
    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)