【发布时间】:2013-06-09 10:54:03
【问题描述】:
在java中,围绕子类进行设计以减少超类功能的好方法是什么?
例如,考虑具有“See”功能的“Man”类和不应该具有该功能但应该具有“Man”具有的所有其他功能的子类“BlindMan”。
我能想到的唯一解决方案是拥有一个抽象类“Man”,以及两个子类“SeeingMan”和“BlindMan”,其中 SeeinMan 添加了一个函数“See”。
然而,这个解决方案的问题是,如果我现在想添加一个“DeafMan”类 - 它扩展了什么?见人?如果那个人又聋又瞎怎么办?
【问题讨论】:
-
您当然可以将
BlindDeafMan作为基类。在这个例子中不是很优雅。另一种(丑陋的)方法是在 BlindMan.see 中抛出 UnsupportedOperationException (就像某些迭代器对删除操作所做的那样)。最后一个(可能也是最好的)选择是让一个人引用一个Eyes类。然后你可以做man.setEyes(new BlindEyes())。 -
你尝试过与接口结合吗?
-
您可以创建 Man 的其他子类为 SingleHandicapMan 和 DoubleHandicapMan,如果 DeafMan 和 BlindMan 都出现,则将它们扩展为 DoubleHandicapMan,如果不将它们扩展为 SingleHandicapMan
-
另见经典的
Rectangle-Square继承难题。 -
我说的是
Rectangle-Square吗?显然我的意思是circle-ellipse problem。