【发布时间】: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