時間,適當的問候:)Java語言:繼承一個類
在Java中實現工作的接口,我有一個接口A.該接口的所有實現也擴展類B,但B不落實A.在一個我們使用A的實例(引用爲A)的類,它被轉換爲B引用,以便我們可以使用在B類中定義的方法。從概念上講,方法應該也屬於接口A.
你能想出一個理由不介紹接口A的方法,這樣我們就不必把它轉換成B了嗎?我是否應該重寫子類中的Method並調用超級版本,以便在IDE中導航等更容易?
時間,適當的問候:)Java語言:繼承一個類
在Java中實現工作的接口,我有一個接口A.該接口的所有實現也擴展類B,但B不落實A.在一個我們使用A的實例(引用爲A)的類,它被轉換爲B引用,以便我們可以使用在B類中定義的方法。從概念上講,方法應該也屬於接口A.
你能想出一個理由不介紹接口A的方法,這樣我們就不必把它轉換成B了嗎?我是否應該重寫子類中的Method並調用超級版本,以便在IDE中導航等更容易?
在我們使用的實例(如甲參考)的一類,它被轉換爲B參考,以便我們可以使用類B.定義
所以我一個方法假設你有這種情況
public void doStuff(A aType){
...
B bType = (B) aType;
...
}
如果這是真的,這可以工作嗎?
private <T extends B & A> void example(T type){
type.aStuff();
type.doBStuff();
}
我創建了以下內容來測試它。
public class Foo{
private static interface A{
void aStuff();
}
private static class B{
public void doBStuff(){
System.out.println("B stuff");
}
}
private static class AB extends B implements A{
public void aStuff(){
System.out.println("A stuff");
}
}
public static void main(String[] args) {
Foo foo = new Foo();
foo.example(new AB());
}
// method "example" already given
}
給我
A stuff B stuff
這可能會起作用。我不知道你可以這樣做。但也許我們應該重新設計一下,因爲它比需要的更復雜。到目前爲止,我只是在界面中重複了這個方法。也許我會再看一看,看看在A和B中是否有真正的價值。實際上,我們推翻了子類中的方法來調用super,因爲如果您在Eclipse中搜索A中使用的方法,那麼您將不會看到它用B引用調用的實例。這太糟糕了。 –
爲什麼不創建一個擴展B並實現A的抽象類?假設這個類將被稱爲C,您的其他類將擴展C並實現A所需的方法,但會在不投射的情況下向您提供B中可用的方法。
我認爲移動方法現在不是一個好主意,也許最多有B實現A(假設你沒有其他的類,你沒有談論哪些類依賴於你提到的類和接口)。
A對於B來說太大而且太不同了,但是謝謝。我應該在例子中解釋更多... –
爲什麼B沒有實現? –
我不知道這些類實際上是什麼,但聽起來像可以通過重新設計整個系統來解決。 – Bubletan
丟棄接口A並僅使用B類。 –