为什么领域与编译指示Perl中的多重继承不兼容?(Why is the fields pragma

2019-09-20 07:27发布

多重继承是伟大的,蛮好的,只要你有你的继承层次结构有清晰的认识和一些潜在的缺陷(如中描述的Perl处理它的perldoc perltoot )。 然而,它不讨论使用的禁止领域的多重继承编译。 事实上,我找不到任何有关这个文档任何...

这里有一个例证:

package Parent1;
use fields 'field1';

package Parent2;
use fields 'field2';

package Child;
use base qw(Parent1 Parent2);

这种失败,出现错误:“在无法复制继承域”

当父母双方都有相同的字段这甚至不工作.. 即使他们可证明一样的,因为他们来自一个共享的祖父母:

package Grandparent;
use fields qw(field1);

package Parent1;
use base 'Grandparent';

package Parent2;
use base 'Grandparent';

package Child;
use base qw(Parent1 Parent2);

有一个缺陷,以实现这个正常是不变的,一个领域的子对象的索引始终是相同其父的索引。 我不知道真正需要这个要求,但是...不像C ++,其中一个对象可以使用类型化的父指针存取,Perl的其参考操作时(确实总是知道真实对象的类型田伪散列本质上是一个虚函数表,不停地在每一个对象实例)。 特别是在上面的第二个示例中,字段从每个父来自父母双方继承的,因此它们可以折叠在一起,并且没有冲突的索引。

我敢肯定有其他一些问题,但我还没有找到他们。

任何人使用Perl的内部的一些知识对此有何评论?

Answer 1:

1)你可以尝试使用,而不是继承代表团, 这里描述 。

2)此外,一些文档(包括上面的链接)似乎暗示与多重继承的问题是,因为伪散列的。 Perl 5.10的改变“田”编译实行比其他伪散列的东西 - 如果它是一个选项,试试你Perl5.10使用的方法,它只是可能工作(我没有存取权限5.10因此无法进行试验,抱歉)

PS关于“我找不到任何有关这个任何文件...” - 在“官方”文件的这至少一个一提的是,从骆驼书(“Perl编程”,O'Reilly的Perl系列中),第3版报价,章31.3。 “使用基地”:

“不支持的字段类的多重继承。使用基地编译抛出一个异常,如果超过一个名为基类有田”。



Answer 2:

字段编译是一个有趣的实验,但在我看来,一个失败的一个。 这是最实用的功能,编译属性哈希键的时间检查,在5.10被删除。 有许多关于CPAN体面类组成的模块,以及所述重量级但在普及稳步增长麋 (“A后现代对象系统为Perl 5”)。

这就是说,如果你想作出努力,以增加多重继承的支持,它可能会受到欢迎; 注意,字段现在从perl的独立地保持为部分“基地”分布 。 你必须做它用伪散列基于(预5.9.0),并限制基于哈希(5.9.0+)的实施工作,虽然。



文章来源: Why is the fields pragma incompatible with multiple inheritance in Perl?