我问了一个similar question yesterday,这是一种技术特有的,但现在我发现自己在广泛意义上对这个主题感到疑惑。基于RTTI或基类修改的基础或子类法案
为了简便起见,我们有两个类,A和B,其中B是由A,B衍生真正的“是” A,和所有A中所定义的例程具有相同的含义B.
假设我们想要显示一个As列表,其中一些实际上是Bs。当我们遍历As的列表时,如果当前对象实际上是一个B,我们想要显示一些Bs附加属性....或者我们只是想要区分Bs的颜色,但A和B都没有任何概念“颜色”或“显示内容”。
解决方案:
使A类由基本上包括一个称为ISB中的方法,()返回假半知道B的。 B将重写该方法并返回true。显示代码将具有如下检查:if(currentA.isB())B b = currentA;
在A中提供一个显示()方法,B可以覆盖....但是然后我们开始合并UI和模型。我不会考虑这个,除非有一些很酷的技巧我没有看到。
使用instanceof来检查,如果要显示的对象的当前确实是一个B.
距离b。添加所有的垃圾,以A,即使它并不适用于A.基本上只包含A中的B(不从A继承)并将其设置为null,直到它适用。这有点吸引人。这与#1相似,我猜是有继承的构成。
看起来这个问题似乎应该不时出现,并有一个明显的解决方案。
所以我想这个问题,也许真的可以归结为:
如果我有一个由延伸的基类,添加新的功能(不只是改变了基类的现有行为)的子类,是我在做一些悲惨的事情?当我们尝试对可能是A或B的对象集合进行操作时,它似乎立即崩溃。
第二段的+1。这是需要区分的外部代码,因为两个类不关心。一个班级责任,而您的班级(层级)责任不是选择在窗口中使用的颜色。 – 2009-04-18 09:26:25