Perl中的重写方法是什么?

时间:2013-06-19 08:30:19

标签: perl oop

这个问题与SUPER类有关。

什么时候会出现“被覆盖的方法”?

所以当我实例化一个类时说:

$object = Classname -> new (some => 'values');

这就是你称之为被覆盖的方法吗?新方法的重写值?

如果是,那么为什么我要使用那个SUPER类?

我可以说:

$object = Classname -> new ();

我再次使用原始方法。有人可以为我澄清一下吗?

2 个答案:

答案 0 :(得分:3)

继承描述了父子关系。父母可以做的一切,孩子班也可以。 E.g。

ParentA    ParentB
=======    =======
foo()      foo()
-------    bar()
     |     -------
     |   /
    Child
    =====

此UML图表显示Child继承自ParentAParentB,例如通过代码

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方法,则会查找该方法

  1. in bar
  2. Child
  3. Child中找到它。
  4. 这称为“方法解析”,本身就是一个棘手的问题。

    如果我们传递一个完全限定的子程序名称作为方法,则不会发生解析,并直接调用该子程序。例如。 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等)使其更具可读性 - 调用诸如“覆盖”,“之前”,“之后”,“围绕”等功能来改变继承的方法