抽象类用很少的抽象方法 - 我应该具体吗?

时间:2017-07-01 16:38:35

标签: java

假设我有一个名为GUIElement的类,由此代码描述:

public abstract class GUIElement {
    public abstract void onScroll();
    //Other methods such as getX(), getY(), onClick() etc.
}

所有扩展它的GUI元素显然都被迫为onScroll编写具体的代码,前提是它们是一个具体的类,但实际上很少使用这个onScroll方法,因为它只是像长GUIText块一样方便。

我的问题是,在这种情况下,最佳做法是什么?继续强制所有子类编写代码,即使它主要是空的,或者使其具体如此:

public abstract class GUIElement {
    public void onScroll() {}
    //Other methods such as getX(), getY(), onClick() etc.
}

并且使用它的几个类只是覆盖它。 或者还有其他更好的选择?

3 个答案:

答案 0 :(得分:2)

如果只需要几个类来实现该方法,那么Adapter Pattern是一个不错的选择。这就是你的第二种方法基本上是什么。在父类中有一个空实现,只有那些需要此功能的子类才能覆盖它,但是他们并没有强制这样做。

例如,查看AWT包中的MouseAdapter。它实现了MouseListener接口,但是所有方法都是空的。然后,子类可以选择是否覆盖这些方法。

答案 1 :(得分:0)

  

我们假设我有一个名为GUIElement的类,由此代码描述:

public abstract class GUIElement {
    public abstract void onScroll();
    //Other methods such as getX(), getY(), onClick() etc.
}
     

所有扩展它的GUI元素显然都被迫为onScroll编写具体的代码,前提是它们是一个具体的类,但实际上很少使用这个onScroll方法,因为它只是像长GUIText块一样方便。

在抽象类中,方法应该是抽象的,因为这个抽象类中的具体方法使用它们,例如:

public abstract class GUIElement {
    public void onScroll(){
      // do stuff
      SomeObject retunValue = calculateInSomeChiledClass();
      // do other stuff
    } 

    potected abstract SomeObject calculateInSomeChiledClass();
}

抽象类不应出于任何其他原因而使用抽象方法。

答案 2 :(得分:0)

制作一个空的具体方法是一种方法,但它有一个结果,因为它不会强制新的声明的类来覆盖它。
如果这个后果对您来说不是一个缺点,那么使用这种方式就可以了。

否则,如果要确保子类明确指定如何实现操作,则应将该方法保持为抽象,并在需要时实现它们并在子类中抛出UnsupportedOperationException或空实现不支持该操作。

这两种解决方案都是可以接受的 遵循一个或第二个取决于您要为子类强调的要点:简单的API或要定义的显式行为。