gpt4 book ai didi

perl - 我如何从 Perl 中的具体类继承?

转载 作者:行者123 更新时间:2023-12-02 06:25:28 36 4
gpt4 key购买 nike

我们的软件将每个设备表示为一个具体类。假设我有一个名为 Cpu-Version-1 的类,它派生自名为 Device 的抽象基类。现在,CPU 供应商想要发布此 CPU 的经济版 (Cpu-Version-2),它是 Cpu-Version-1 的功能缩减版(显然以更低的价格)。 Cpu-Version-2 的 90% 代码与 Cpu-Version-1 相同,但剩余的 10% 代码不再相同。即这些是已在 Cpu-Version-2 中删除的功能,因此我不应该再代表它。

现在设计这个类的最佳方式是什么?我可以从 Cpu-Version-1 继承 Cpu-Version-2(尽管继承并不完美,因为这两个设备是对等设备)。这将迫使我重写 cpu-version-1 的许多方法而无所事事(这看起来很丑,而且不知何故感觉不对)。此外,我认为我无法更改基类(Cpu-Version-1 或其基类),因为代码已经在生产中并且需要大量批准和证明。如果你是我,你会如何做出这个设计决定?

我们如何使 Cpu-Version-2 尽可能地可重用和可维护?有什么你会遵循的 OOP 原则吗?还是采取简单的出路并覆盖 Cpu-Version-1 的所有不适用方法什么都不做是更好的权衡?我使用面向对象的 Perl 编写代码。

最佳答案

我认为阻碍面向对象编程项目进展的主要绊脚石之一是一种常见的误解,即认为继承是从多个来源组成新类的唯一方式。但总的来说,继承实际上是一个非常糟糕的模型,并且只真正适用于可以在完美层次结构中整齐分类的事物。正如您所发现的,现实世界通常不是这样运作的。

听起来继承不是解决这个问题的好模型。幸运的是,还有其他模型可用于在 Perl 中构造类。

Moose , 你可以使用 roles用于将类与它们“做”的事情组合起来,而不必创建复杂的(在这种情况下,不合适的)继承层次结构。

如果您不想要像 Moose 这样重型的东西,还有更简单的选择,例如 mixin .

您可能感兴趣的另一个选项是基于原型(prototype)的组合,如 Class::Prototyped .这仍然是基于层次结构的,但是通过允许您弄乱单个实例然后将它们用作新实例的原型(prototype),从而为您提供了更多的灵 active 。这就是 OO 在 Javascript 和 Self 等语言中的实现方式。

关于perl - 我如何从 Perl 中的具体类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1685325/

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