簡體   English   中英

在實現的抽象方法中調用超類方法

[英]Calling super class method inside implemented abstract method

Basicaly我需要幾個方法做同樣的事情,但子類可以選擇不同的參數,並仍然強制實現。 這是正確的方法/設計嗎?

編輯:我編輯了addItem()體,這些方法包含用於處理傳遞參數的最終邏輯

public abstract Class A {
    public abstract void addItemImpl()

    addItem(String s) {
        // do stuff
    }
    addItem(Collection c) {
       // do stuff
    }
    addItem(Item item) {
        // do stuff
    }
}

public  Class B extends A {
    addItemImpl() {
        addItem("text, text2")
    }
}

public Class C extends A {
    addItemImpl() {
        addItem([item, item2])
    }
}

不,這不行。

您將無法定義“doStuff()”方法,因為您必須處理參數。 您提供的信息不足,無法為您提供詳細的幫助。 但是仿制葯可能會派上用場:

public abstract Class A<T> {
    public addItem(T t) {
        // dostuff with t
    }
}

public  Class B extends A<String> {
}

public Class C extends A<Collection> {
}

你所擁有的在技術上是正確的,但是不知道addItem實際上做了什么,很難知道這是否是最好的解決方案。 我的猜測是,可能有更好的方法。

如果addItem基本上設置了要在doStuff中使用的值,我只會在B類和C類中執行此操作。 任何其他需要以與B相同的方式執行此操作的人可以將其擴展而不是A

編輯:根據你的編輯,我會說這可能是一個使用抽象類的壞例子。 沒有真正共享的功能。 接口更合適,因為您需要為每個接口實現不同的實現。 你只是試圖在抽象類中隱藏它。 我會將A更改為接口以及使用泛型。

如果實際上共享代碼在所有類中完全相同而不必使任何技巧使其工作(如上所述),則只進入抽象類路由。

這是一個完美的案例:支持組合而不是繼承。

您的子類不會從超類中充分受益,也不依賴於其實現細節。 然后為契約B定義一個接口, C必須遵守( addItemImpl() )並用A組合它們。

問問自己: B真的是A嗎? C真的和A

如果您需要強制實現幾種方法,那么Abstract方法是理想的。

但要小心,只有超級類的 第一個 Non-Abstract 子類必然會實現其中的所有抽象方法....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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