gpt4 book ai didi

perl - 为什么 fields pragma 与 Perl 中的多重继承不兼容?

转载 作者:行者123 更新时间:2023-12-01 10:15:32 25 4
gpt4 key购买 nike

多重继承很棒,只要您清楚地了解您的继承层次结构和一些潜在的陷阱(例如 perldoc perltoot 中描述的那些),Perl 就能很好地处理它。但它没有讨论禁止使用 fields具有多重继承的 pragma。事实上,我找不到任何关于此的文档......

这是一个例子:

package Parent1;
use fields 'field1';

package Parent2;
use fields 'field2';

package Child;
use base qw(Parent1 Parent2);

此操作失败并出现错误:“无法在...处乘以继承字段”

即使 parent 双方拥有相同的字段,这也不起作用。甚至当他们被证明是相同的时候,因为他们来自共享的祖 parent :

package Grandparent;
use fields qw(field1);

package Parent1;
use base 'Grandparent';

package Parent2;
use base 'Grandparent';

package Child;
use base qw(Parent1 Parent2);

正确实现这一点的一个陷阱是子对象中字段的索引始终与其父对象中的索引相同的不变性。我不确定这个要求是否真的需要,但是......与 C++ 不同,在 C++ 中,可以使用类型化为父对象的指针访问对象,Perl 在对其引用进行操作时总是知道对象的真实类型(实际上是fields pseudohash 本质上是一个 vtable,保存在每个对象实例上)。特别是在上面的第二个示例中,从每个父级继承的字段都来自两个父级,因此它们可以折叠在一起并且没有冲突的索引。

我确定还有其他问题,但我还没有找到它们。

任何对 Perl 内部结构有一定了解的人都可以对此发表评论吗?

最佳答案

1) 你可以尝试用委托(delegate)代替继承,as described here .

2) 此外,一些文档(包括上面的链接)似乎暗示多重继承的问题是因为伪哈希。 Perl 5.10 将“字段”pragma 的实现更改为伪散列以外的其他东西 - 如果它是一个选项,请尝试您在 Perl5.10 中使用的方法,它可能会起作用(我没有 5.10 的权限,所以无法试验,抱歉)

附言关于“我找不到任何关于这个的文档......” - 在“官方”文档中至少有一个提及是引用自 Camel 书(“Programming Perl”,O'Reilly 的 Perl 系列),第 3 版,章节31.3。 “使用基础”:

"Multiple inheritance of field classes is not supported. The use base pragma raises an exception if more than one named base class has fields."

关于perl - 为什么 fields pragma 与 Perl 中的多重继承不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1168644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com