2015-05-21 39 views
1

時間,適當的問候:)Java語言:繼承一個類

在Java中實現工作的接口,我有一個接口A.該接口的所有實現也擴展類B,但B不落實A.在一個我們使用A的實例(引用爲A)的類,它被轉換爲B引用,以便我們可以使用在B類中定義的方法。從概念上講,方法應該也屬於接口A.

你能想出一個理由不介紹接口A的方法,這樣我們就不必把它轉換成B了嗎?我是否應該重寫子類中的Method並調用超級版本,以便在IDE中導航等更容易?

+7

爲什麼B沒有實現? –

+0

我不知道這些類實際上是什麼,但聽起來像可以通過重新設計整個系統來解決。 – Bubletan

+0

丟棄接口A並僅使用B類。 –

回答

4

在我們使用的實例(如甲參考)的一類,它被轉換爲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
+0

這可能會起作用。我不知道你可以這樣做。但也許我們應該重新設計一下,因爲它比需要的更復雜。到目前爲止,我只是在界面中重複了這個方法。也許我會再看一看,看看在A和B中是否有真正的價值。實際上,我們推翻了子類中的方法來調用super,因爲如果您在Eclipse中搜索A中使用的方法,那麼您將不會看到它用B引用調用的實例。這太糟糕了。 –

0

爲什麼不創建一個擴展B並實現A的抽象類?假設這個類將被稱爲C,您的其他類將擴展C並實現A所需的方法,但會在不投射的情況下向您提供B中可用的方法。

我認爲移動方法現在不是一個好主意,也許最多有B實現A(假設你沒有其他的類,你沒有談論哪些類依賴於你提到的類和接口)。

+0

A對於B來說太大而且太不同了,但是謝謝。我應該在例子中解釋更多... –