【问题标题】:How to "nicely" detect the direct parent of a class in Perl?如何“很好地”检测 Perl 中类的直接父级?
【发布时间】:2012-08-20 02:11:24
【问题描述】:

请注意,在这种情况下,UNIVERSAL::isa 对我不起作用。 我不想像__PACKAGE__->isa('UNIVERSAL') 那样走上继承树。

这是一个例子:

  use 5.10.1;
  use strict;
  use warnings;
  use utf8;
  {
    package Parent;
    #How to do this more elegantly?
    sub inherits_from_parent {
      no strict 'refs';
      return (__PACKAGE__ eq @{"$_[0]\::ISA"}[0]);
    }
  }
  {
    package Child;  
    use parent -norequire, qw(Parent);
  }
  package main;

  say "Child directly inherits from Parent"
    if Child->inherits_from_parent;
  #not wat I want 
  say 'Child is universal:'.Child->isa('UNIVERSAL');

有没有更好的方法(不使用no strict 'refs';)来检测类的直接父级? 谢谢。

【问题讨论】:

  • 为了简单起见,我不检查 $_[0] 是否是一个对象。
  • 想知道一个对象的继承细节是违反封装的,所以很难做到。你可能有一个设计问题,你为什么要这样做?也许我们可以找到更好的方法。
  • 我有一个继承树。有一个具有抽象方法的类,另一个具有较少抽象方法的类继承了一些功能并添加了更多功能。第二类也不能实例化。第二类的孩子可以有实例。因此,第一个(祖父类)中定义的某些方法/功能必须仅在可安装类中使用。具体来说:github.com/kberov/DBIx--Simple--Class/blob/master/lib/DBIx/…
  • 这有点道理,虽然我不知道它是否值得被滥用。 For example 这个方法改变它的功能取决于它是否被称为半抽象基类的类方法。与 rafl 交谈,这作为一个角色更有意义。它是 A) 无法实例化的东西,B) 实现了某些功能,C) 需要用户实现其余的。
  • " 例如,此方法会根据...更改其功能。" 完全正确。这就是想法。我还没有使用角色。将阅读更多关于它们的信息。我对自己提出的一个要求是尽可能多地使用核心 Perl 5.10.1+ 发行版中的内容。这就是为什么我需要在我的课堂上实现它而不是(如果可能的话)依赖于其他东西。我在这里发布了我的问题,以确保我不是太“粗鲁”:)。谢谢。

标签: perl oop inheritance


【解决方案1】:

我不认为查看类的@ISA 数组有什么问题,事实上,这就是 Perl 所做的,几乎可以肯定任何诊断模块都会这样做。请记住,当您知道自己为什么这样做时,关闭部分 strict 并没有什么坏处,这就是其中一种情况。

对于您的实际问题,通过谷歌搜索发现了一些可能性,其中 Curtis Poe (Ovid) 的 Class::Sniff 可能是最好的例子。

我知道Data::Printer 在转储对象时会打印出类层次结构。它的输出是供人类读者使用的,但您也许可以查看它的代码以了解它的作用。同样,我几乎可以肯定它完全符合您在示例中所做的工作!

【讨论】:

  • 是的,非常感谢。似乎将它包装在一个方法中是我能做的最好的:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2017-01-23
  • 2020-12-06
  • 2017-03-01
  • 1970-01-01
相关资源
最近更新 更多