抽象类方法头与接口

时间:2014-06-02 00:00:09

标签: java interface conventions abstraction

我有100个扩展抽象类的类。

这些类中的50个需要使用方法foo(),这在每个类中都有所不同。

我知道有两种方法可以做到这一点:

Option #1: 使用interface创建一个方法foo(),并在50个类中创建implementinterface

Option #2: 向父类添加abstract方法标头foo(),并将foo()方法留空50个类。

其中哪一个是更好的约定?为什么?或者有没有更好的方法我没有想到?

1 个答案:

答案 0 :(得分:6)

还有第三个选项 - 创建一个扩展基本抽象类的抽象类,并让50个类扩展为“中间”抽象类,如下所示:

abstract class Base {
    public abstract void bar();
}
abstract class BaseWithFoo extends Base {
    public abstract void foo();
}
class OneOfFiftyWithFoo extends BaseWithFoo {
    @Override
    public void foo() {
        ... // Implementation
    }
}

如果你需要在foo的50个实现中共享一些公共代码,我会使用这种方法。此外,它还允许您编写知道对象具有Base BaseWithFoo方法的代码。

我肯定foo添加到Base抽象类,因为根据您的要求,该方法不适用于大约一半的类。< / p>

需要考虑更多参数。

  • 扩展抽象类的每个类都需要foo()吗?

    • 如果否:无效的方法很难看,请转到步骤3或使用界面。
    • 如果是:转到第2步。
  • 每个子类是否以同样的方式实现foo()

    • 如果是:在超类中实现它。
    • 如果否:转到第3步
  • 是否有更大的子类子部分可以从另一个抽象子类中的相互实现中获益?

    • 如果是:使用中间抽象类来实现功能。
    • 如果否:将foo()的实现指向每个子类。