假设我有一个类Foo,它有一堆逻辑,另一个类Bar基本相同.然而,由于Foo和Bar是不同的(但相关的)实体,我需要从我的代码中明显的区别(即我可以判断一个实例是一个Foo还是一个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,logic and what-not */ private boolean isABar; // Could be an enum }
你怎么看?你如何处理这些“标记类”?
作为我的代码可能希望对待Foo和Bar的一个例子,我的代码将需要能够像List&Foo>和列表< Bar>. A Foo无法进入列表< Bar>反之亦然.
@H_404_18@解决方法
在我看来,最好是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语句.