簡體   English   中英

很少使用抽象方法的抽象類-我應該具體化嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM