传统类层次结构的一个众所周知的缺点是,在对现实世界建模时,它们是不好的。例如,尝试用类来表示动物的种类。这样做确实存在几个问题,但是我从未见过的解决方案是,当子类“丢失”超类中定义的行为或属性时,例如企鹅无法飞行(有也许是更好的例子,但这是我想到的第一个)。
一方面,您不想为每个属性和行为定义一些标志来指定它们是否全部存在,并在访问该行为或属性之前每次对其进行检查。您只想说在Bird类中,鸟类可以简单,清晰地飞行。但是,如果以后可以定义“例外”而不必到处使用一些可怕的骇客,那就太好了。当系统生产一段时间后,通常会发生这种情况。您突然发现一个根本不适合原始设计的“例外”,并且您不想更改代码的很大一部分来容纳它。
因此,是否有一些语言或设计模式可以干净地处理此问题,而无需对“超类”以及使用它的所有代码进行重大更改?即使解决方案仅处理特定情况,也可以将多个解决方案一起形成一个完整的策略。
经过更多思考,我意识到我忘记了《里斯科夫替代原则》。这就是为什么你不能这样做。假设您为所有主要的“功能组”定义了“特征/接口”,则可以在层次结构的不同分支中自由实现特征,例如“飞翔”特征可以由Birds以及某些特殊的松鼠和鱼来实现。
因此,我的问题可能是“我如何取消实施特质?” 如果您的超类是Java可序列化的Java,则即使您无法对状态进行序列化(例如,如果您包含“ Socket”),您也必须也是一个。
一种方法是始终从一开始就成对定义所有特征:Flying和NotFlying(如果不进行检查,则会抛出UnsupportedOperationException)。非特征不会定义任何新接口,可以简单地进行检查。听起来像是“便宜”的解决方案,特别是如果从一开始就使用它。
" it would be nice if one could define "exceptions" afterward, without having to use some horrible hacks everywhere"
您是否认为控制行为怪异的工厂方法?
NotSupportedException
从Penguin.fly()
。
class Penguin < Bird; undef fly; end;
。是否应该是另一个问题。
function save_yourself_from_crashing_airplane(Bird b) { f.fly() }
将变得更加复杂。(正如