perl – 确定是否已从基类重写基类子例程

前端之家收集整理的这篇文章主要介绍了perl – 确定是否已从基类重写基类子例程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题困扰了我,但我已经解决了问题,并将发布我的答案.

我有一个名为Parent的基类

package Parent;

sub new {
    my $c = shift;
    my $s = {},bless $s,$c;
    return $s;
}

sub who {
    return "parent";
}

1;

这个父类暴露了一个方法;谁.

我写了两个孩子课:Child和Freak.只有孩子才能覆盖谁.

儿童

package Child;

use base 'Parent';

sub who {
    return "child";
}

1;

怪物

package Freak;

use base 'Parent';

1;

基类如何确定是否已重写方法的基础?

我希望能够写出这样的东西

package Parent;

sub new {
    my $c = shift;
    my $s = {},$c;
    return $s;
}

sub who {
    return "parent";
}

sub check {
  my $self = shift;

  my $is_overridden = 1; # what conditional should be here?

  return $is_overridden ? "yes" : "no";
}

1;

我可以使用什么条件来确定子程序是否被覆盖?

解决方法

my $is_overridden = $self->can("who") != Parent->can("who");

请参阅UNIVERSAL软件包的文档,其中定义了can.

另外,我应该添加一个更哲学的注释 – 听起来你的重写违反了Liskov Subsitution Principle,重构事物可能会更好,因此重写方法不是你必须在代码中的其他地方调查的东西.

猜你在找的Perl相关文章