假设我有一个类Foo
中有一堆逻辑,另一个类Bar
基本相同.然而,作为Foo
和Bar
不同(但相关)的实体,我需要从我的代码中明显区别(即我可以判断一个实例是a Foo
还是a Bar
)
当我在没有多想的情况下一起打击这个时,我最终得到了以下内容:
public class Foo { /* constructors, fields, method, logic and what-not */ } public class Bar extends Foo { /* nothing here but constructors */ }
这个可以吗?Bar
复合课程更好吗?例如:
public class Bar { private Foo foo; /* constructors and a bunch of wrapper methods that call into foo */ }
或者甚至,当我们在它的时候,更低技术的东西:
public class Foo { /* constructors, fields, method, logic and what-not */ private boolean isABar; // Could be an enum }
你怎么看?你如何处理这些'标记类'?
作为如何我的代码不妨把一个例子Foo
并Bar
不同,我的代码将需要能够做的东西一样List
和List
.A Foo
不能进入,List
反之亦然.
在我看来,最好是Foo
和Bar
子类关闭一个共同的祖先类(也许AbstractFoo
),它具有所有功能.在Foo
和之间应该存在什么样的行为差异Bar
?将差异编码为抽象方法AbstractFoo
,而不是if
在代码中使用语句.
示例:而不是:
if (foo instanceof Bar) { // Do Bar-specific things }
改为:
class Bar extends AbstractFoo { public void specialOp() { // Do Bar-specific things } } // ... foo.specialOp();
这种方法的好处是,如果你需要第三个类,这很像Foo
但只有一点点差别,你不必遍历所有代码并添加编辑所有if
语句.:-)