有人可以提供脆弱基类问题的更好例子吗?

时间:2009-01-17 09:31:50

标签: oop inheritance

脆弱的基类是在每次讨论中都会出现的最常见的一点,在讨论中讨论了通过实现继承的可重用性。

除了常见的方形矩形示例之外,还有没有人遇到任何真正的问题。

每次我需要向某人解释这一点时,我会遇到一些现实世界的案例,这些案件引起了这些问题以及如何解决这个问题。

如果有人想分享他们对此的经验,那将非常有帮助。

这是一个了解此问题的维基百科链接

Fragile base class on wikipedia

编辑:

我对此的投入...... 当基类版本发生更改时,问题通常发生,因为使用它的开发人员可能不知道基类实现发生的扩展,并且基类实现者可能没有关于所有派生类的所有必要细节。看似无害的更改可能会破坏所有派生类功能。无论如何,这是一个糟糕的设计实践,因为它会违反OCP原则。

在软件旧论坛上得到了Joel的好评。想把它放下来。

“我们无法有时处理现代生活的复杂性,实际上是自然界中脆弱的基类问题的一个例子,原因是我们仍然继承了我们祖先的许多特征,这些特征导致了不同的生活。”

1 个答案:

答案 0 :(得分:7)

是的 - java.util.Properties是一个很难得到的。

目前让我们抛开它从java.util.Hashtable派生的事实(这意味着它有get(Object)put(Object, Object),尽管属性总是字符串......

我曾经将java.util.Properties子类化为提供一种层次结构 - 在我拥有的属性文件中:

x.y.z = 10
a.b.c = 10

你可以问“x”的“master”属性(使用新的方法调用),它会给你另一个有效包含“yz = 10”等的属性对象。它可以方便地继承java.util .Properties尽可能多的其他代码段已经知道使用过的属性。如果它实现了一个接口,我就不会有子类,我也不会遇到任何问题:(

无论如何,我需要覆盖getProperty()以在必要时引用回父属性。但有两个重载 - 我应该覆盖哪些? getProperty(String)是否调用getProperty(String,String),反之亦然?也许我只需要覆盖get()?它没有记录,如果我只覆盖其中一个,实现可能会在以后的版本中更改以切换事物 - 所以我需要覆盖它们。

其他各种方法也是如此(保存和加载是一种痛苦,IIRC--这是很久以前的事了)。基本上我可以更简单地完成这项工作,如果我可以依赖于不改变的属性的实现 - 但这显然会让Sun更难以在以后改进实现。

无论如何,这是一个明确的例子,其中组合和暴露客户端依赖的接口将更好地