2012-08-17 140 views
1

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]) 
    } 
} 
+0

這是一個相當奇怪的模式。爲什麼你只需要使用基類中的所有方法? – biziclop 2012-08-17 15:58:42

+0

我不明白DoStuff應該如何工作。是否必須檢查每個項目類型以決定哪些項目已被添加? – Heisenbug 2012-08-17 16:00:47

+0

我已更新我的問題,做的東西只是虛擬邏輯來處理參數,而不是一個具體的方法 – Dopele 2012-08-17 16:10:20

回答

0

如果需要強制執行的一些方法,最終的邏輯,那麼Abstract方法是理想的。

但要小心,只有第一個Non-Abstract子類的超類勢必實現這一切的抽象方法....

1

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

如果addItem本質上設置了要在doStuff中使用的值,那麼我只需在類BC中執行那項工作。其他任何需要以與B相同的方式執行此操作的人可以擴展它,而不是A

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

如果實際上在所有類中都有完全相同的共享代碼,而不必執行任何技巧使其工作(如上所述),那麼只能使用抽象類路由。

2

不,這是行不通的。

您將無法定義「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> { 
} 
+0

泛型很可能是答案。很好的接收。 – 2012-08-17 16:04:40

+0

這不是一個很好的解決方案,除非你能處理所有可能的'T'。這似乎並非如此。 – biziclop 2012-08-17 16:08:31

+0

這是真的,只是在問題更新之後;)。 – Arne 2012-08-17 21:59:07

1

這是一個完美的案例:在繼承青睞組成。

你的子類沒有完全從超類中受益,也不依賴於它的實現細節。然後爲合同BC定義一個接口必須遵守(addItemImpl())並將它們與A合成。

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