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