java - 有一个扩展另一个类的 'empty' 类可以吗?

标签 java

假设我有一个类(class) Foo里面有一堆逻辑和另一个类 Bar这本质上是一样的。然而,作为 FooBar是不同的(但相关的)实体 我需要从我的代码中看出区别(即我可以判断一个实例是 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>反之亦然。

最佳答案

在我看来,最好是 FooBar 从一个共同的祖先类(可能是 AbstractFoo)继承子类,它具有所有功能. FooBar 之间应该存在什么行为差异?在 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/

相关文章:

java - 从 tomcat context.xml 而不是 application.properties 获取数据源

java - 基于 3 列对多维数组进行排序

java - 检查值是否没有数字,如果是,则用简写 Java 替换为 'Invalid'

java - 如果我改变了java类的包。旧序列化版本的反序列化仍然有效吗?

java - Spring:默认选择bean

java - 计算最后一个星期天前1周和今天到最后一个星期日

java - 简单的 XML @ElementMap 无法满足关键属性

java - mockito.AdditionalAnswers.returnsFirstArg() 用于重载方法

java - Java中的类扩展实现

java - 如何删除 JOptionPane 中的问号?