抽象类方法头与接口

Evo*_*lor 0 java abstraction interface conventions

我有100个类,它们扩展了一个抽象类.

这些类中的50个将需要具有该方法foo(),该方法在每个类之间变化.

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

Option #1:创建一个单方法interfacefoo(),并且implementinterface在类50.

Option #2:将abstract方法标题添加foo()到父类,并将foo()方法留空50个类.

以下哪项是更好的约定?为什么?或者有没有更好的方式我没有想到?

das*_*ght 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我绝对不会添加fooBase抽象类中,因为根据您的要求,该方法不适用于大约一半的类.

还有更多参数需要考虑.

  • 是否每个扩展抽象类的类都需要foo()

    • 如果否:无法运行的方法很难看,请转到步骤3或使用界面.
    • 如果是:转到步骤2.
  • 难道每个子类中实现foo()的一样吗?

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

    • 如果是:使用中间抽象类来实现功能.
    • 如果没有:直接执行foo()每个子类.

  • 我写完了一个关于这个想法的小流程图,我相信它符合你的建议.我会将它添加到您的帖子中,但如果您不同意某个方面,请随时调整/删除它. (2认同)
  • 第四种选择是为方法`foo()`声明一个接口`Foo`,将`BaseWithFoo`声明为`实现Foo`,并省去抽象方法. (2认同)