java - 抽象类方法头与接口(interface)

标签 java interface conventions abstraction

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

其中 50 个类需要具有方法 foo(),每个类的方法各不相同。

据我所知,有两种方法可以做到这一点:

选项#1: 使用 foo() 创建单一方法接口(interface),并在 50 个类中实现接口(interface)

选项#2: 将abstract方法头foo()添加到父类中,并将50个类中的foo()方法留空。

以下哪一个是更好的约定,为什么?或者还有我没有想到的更好的方法吗?

最佳答案

还有第三个选项 - 创建一个扩展基抽象类的抽象类,并让 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 抽象类中,因为从您的要求来看,该方法不适用于粗略的情况一半的类(class)。

还有更多参数需要考虑。

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

    • 如果不是:不起作用的方法很难看,请转到步骤 3 或使用接口(interface)。
    • 如果是:请转至第 2 步。
  • 每个子类都以同样的方式实现foo()吗?

    • 如果是:在父类(super class)中实现它。
    • 如果否:转到步骤 3
  • 是否有更大的子类子部分可以从另一个抽象子类中的相互实现中受益?

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

关于java - 抽象类方法头与接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985694/

相关文章:

java - 是否可以使用不同的方法将相同的映射映射到两个不同的 Controller ?

java - 如何像使用接口(interface)一样使用枚举?

java - 因为所有接口(interface)方法都是公共(public)的,这是否意味着接口(interface)方法的所有实现也必须是公共(public)的

javascript - 在 Ember.js 中实现 Accordion 式 View

java - java中的简单超时

java - 使用哪种数据结构来获得所需的结果

.net - WCF 和接口(interface)继承 - 这是一件可怕的事情吗?

objective-c - Objective-C 中的私有(private)和 protected 方法

java - ArrayList 中的对象不使用泛型保留其类型