【问题标题】:Perl: oo with use parent - checking if class has a parentPerl:oo with use parent - 检查类是否有父级
【发布时间】:2015-11-09 05:37:47
【问题描述】:

我有一些 Perl 对象是不久前用 Moose 构建的, 但幸运的是,继承是使用 'parent' pragma 实现的。

现在我想知道是否有办法检查某个类是否使用了'parent'。

例如如果我有两节课

package Animal;
sub new { 
   my $class = shift;
   return bless {}, $class;
}
1;

package Cat;
use parent 'Animal';

sub new { 
   my $class = shift;
   return bless {}, $class;
}
1;

我是否可以进行一些检查以确定“猫”类 有一个父母(不关心哪个,但不是它自己),而 Animal 没有,给定一个 $foo 是他们中的任何一个?

【问题讨论】:

  • 是的,但我不愿意告诉你,因为我怕你会利用它来作恶。
  • 我一定会的。请问?
  • 我现在使用 Moose 进行 OO 相关,但我不想重做。
  • 这种支票有什么用途?
  • 有些子方法调用SUPER方法需要未设置的属性。所以在 new 中,我想检查是否有父级,所以我可以让它在必要时设置那些需要的属性。也许我误解了一些东西,但这是我解决这个问题的第一个想法,而不是编辑所有可能导致此问题的父类或子类。但是如果没有父级就没有必要了。

标签: perl


【解决方案1】:

我无法想象您为什么想知道这一点,但可以使用以下方法:

use mro;
my $inherits = @{ mro::get_linear_isa($class) } > 1;

my $isa = do { no strict 'refs'; \@{ $class . '::ISA' } };
my $inherits = @$isa;

注意事项:

  1. 所有类都继承自 UNIVERSAL,但除非某个类明确声明它继承自它,否则它会被忽略。
  2. 这些方法不关心继承是如何声明的(use parent 或其他方式)。

【讨论】:

  • 好吧,最后,我以为我想这样做,然后发现这有点不必要,但又忍不住想弄清楚该怎么做。谢谢你的回答,我现在已经用另一种方法解决了,但还是很高兴知道。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多