[英]Abstract class with little used abstract method - should I make concrete?
假設我有一個名為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.
}
並且有幾個使用它的類會將其覆蓋。 也許還有其他更好的選擇?
如果僅需要幾個類來實現該方法,那么適配器模式是一個不錯的選擇。 也就是說,您的第二種方法基本上是什么。 父類中有一個空的實現,只有那些需要此功能的子類才可以覆蓋它,但並不強制這樣做。
以AWT包中的MouseAdapter為例。 它實現了MouseListener
接口,但是將所有方法都留空。 然后,子類可以選擇是否覆蓋這些方法。
假設我有一個名為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();
}
出於任何其他原因,抽象類不應具有抽象方法。
制作一個空的具體方法是一種方法,但是有一個結果,因為它不會強制新聲明的類重寫它。
如果此結果對您而言不是不利,則使用此方法很好。
否則,如果要確保子類顯式指定如何實現該操作,則應將該方法保持為抽象,並在需要時將其實現,並在不支持該操作的子類中拋出UnsupportedOperationException
或空實現。
兩種解決方案都是可以接受的。
遵循一個或第二個取決於子類要強調的一點:要定義的簡單API或顯式行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.