假设我有一个类(class) 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, fields, method, logic and what-not */
private boolean isABar; // Could be an enum
}
你怎么看? 您如何处理这些“标记类”?
作为我的代码可能希望如何处理 Foo
的示例和 Bar
不同的是,我的代码需要能够做类似 List<Foo>
的事情和 List<Bar>
. Foo
不能进入 List<Bar>
反之亦然。
最佳答案
在我看来,最好是 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
语句。 :-)
关于java - 有一个扩展另一个类的 'empty' 类可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/143084/