2012-07-28 42 views
0

我有一個實現兩個接口的抽象類。我是否正確思考因爲我使用兩個接口,我不能使用任一接口來實現動態綁定?原因是如果我使用其中一個接口,我顯然無法從其他接口調用方法,因爲類型系統只允許子類型調用由我用來聲明多態變量的接口定義的方法。有效的Java項目19-僅使用接口來定義類型

因此,我的實際問題是,OK,我才真正使用的接口,以確保我的抽象類(或子類)絕對提供了方法的實現?這似乎與第19條所述的內容相矛盾 - 你應該只使用接口類型(我把它看成是多態)。

實施例:

public interface A{ 
    public void meth1(); 
} 

public interface B{ 
    public void meth2(); 
} 

public abstract class C implements A,B{ 

} 

public void DynamicBinding(A aobject){ 
    //Can only call aobject.meth1(); 
} 
+4

我不明白你的問題。動態綁定與多態性密切相關。事實上,我認爲他們是幾乎相同的兩個術語。 – 2012-07-28 22:28:18

+0

我在說的是,我無法使用接口進行子類型化,因爲我需要使用多態變量中的兩個接口中的方法。因此,可以使用抽象類來進行子類型劃分,然後只使用接口來確保方法的實現。這似乎與第19項相矛盾 – user997112 2012-07-28 22:35:46

回答

1

當需要從只A然後A方法如已示出的可以被用作對象的類型。同樣適用於B。如果您需要這兩種方法,讓你做一個新的接口:

public interface C extends A, B { 
} 

接口允許extend比一個接口的更多。

然後你就可以添加一個抽象類的默認實現,如果你想:

public abstract class D implements C { 
    // implementation details 
} 
+0

但是我的抽象類呢,它已經包含了兩者的方法?那就是爲什麼我認爲可以使用抽象類來進行子類型化? – user997112 2012-07-28 22:45:29

+0

你可以在問題中包含抽象類,以便我們看到你的建議。 – 2012-07-28 22:49:29

+0

@HåvardGeithus我不小心忘了,包括「抽象」爲C類的定義,它是現在有... – user997112 2012-07-28 22:51:06

5

可以使用泛型有你的方法採取兩種A型的參數和B:

public <T extends A & B> void method(T param) { 
    param.meth1(); // fine 
    param.meth2(); // also fine 
} 

相關問題here

+0

這與傳遞Code-Guru的子接口C作爲該方法的類型參數不一樣嗎? – 2012-07-28 22:46:30

+1

對於這個例子,是的。這個解決方案還有一些其他的好處,例如你不必創建一個子接口,如果第一個參數是一個類(而不是接口),它也可以工作。 – Jorn 2012-07-28 22:49:13

+0

因此,如果它是一個類,將「擴展」解釋爲「實現」? (Java不允許多重繼承)。 – 2012-07-28 22:51:15

0

你可以做

public void DynamicBinding(C cobject){ 
    c.meth1(); 
    c.meth2(); 
} 

或稍差變種

public void DynamicBinding(A aobject){ 
if(aobject instanceof C) 
     { 
      C myC=(C)aobject; 
      myC.meth1(); 
      myC.meth2(); 

     } 
} 

反正我喜歡喬恩做更好。