假设我有一个名为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.
}
并且使用它的几个类只是覆盖它。 或者还有其他更好的选择?
答案 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或要定义的显式行为。