2013-04-17 27 views
0
綁定麻煩

於是我在一個問題已經運行,並已破壞我的大腦試圖找出了兩天,所以我想是時候得到一些幫助。經與動態Java中

所以這裏在我的問題是我有擴展抽象類A抽象類B,我不重寫B中的任何方法或任何東西,但指定更專業的行爲,變量和這樣的。

現在,這裏是我的問題出現在哪裏,我有第三課讓我們說C類,實現所有適當的方法,也許覆蓋一些(我使用@Override表示法,所以我知道它做得很好),並可能添加一些自己的方法和變量。

現在,這是偉大的,但是當我試圖創建一個類型的數組,我想使用動態的,因此我可以添加C型,或其他任何導致回A像這樣的對象結合。

A[] AObjects = new A[3]; 
Aobject[0] = new C(); 
so on and so forth 

現在讓我們說我有一個像getNum()方法;在C裏面只有C,它一直告訴我,getNum();在我嘗試使用它時沒有在類型A中定義。我錯過了什麼嗎?因爲根據我的理解,方法只在運行時綁定,所以我應該能夠獲取類型A的引用變量,並將其分配給類型C的對象,並且能夠調用C中的所有公共成員,對?或者數組的規則不同?

P.S我用保護我的變量,公衆對我的方法。

任何幫助將不勝感激! :)謝謝

+0

你如何訪問C類型的對象? 'Aobject [0] .getNum()'不能按照Java規範工作,但'((C)Aobject [0])。getNum()'應該可以正常工作。 – torquestomp

+0

@torquestomp謝謝:) –

回答

0

如果您有一個類型爲A[]的數組,並向其中添加了一個C類型的對象,則可以將其有效地上傳到A。所以,當你做這樣的事情

A[] aObjects = new A[3]; 
aObjects[0] = new C(); 
aObjects[0].someMethodOnlyDefinedForC(); // <-- Compile error 

你能想到的編譯器的解釋是這樣的:

C objectOfTypeC = new C(); 
A objectCastToTypeA = (A) objectOfTypeC; // Upcasting to A 
A[] aObjects = new A[3]; 
aObjects[0] = objectCastToTypeA; 
objectCastToTypeA.someMethodOnlyDefinedForC(); // <-- Compile error 

將它添加到的A[]數組,你告訴那個只關心編譯器在類A中定義的通用接口,而不是在任何子類中定義的方法。

當然,如果您可以保證某個索引處的項目總是屬於C,您可以像((C) aObjects[0]).methodOnlyDefinedForC()那樣向下回放,但以這種方式欺騙類型系統有點代碼味道。確定這些類是否應該互相繼承,或者如果您可以更好地利用多態來實現您所需的內容。

如果你真的確實需要在陣列中,這取決於它們是否A類型,B,或C的進行中的項目不同的動作,那麼你可能會考慮在Visitor Pattern

+0

謝謝! :)大大apreciate輸入! :)而且就像我說過我正在跟着一本古老的遊戲編程書一樣,我得到了一個點,告訴我我可以做到這一點,它只是沒有加起來,但是是更多的意義現在! :) –

1

如果該類有該方法的定義,那麼只能調用該方法的一個方法,因此如果A未定義getNum(),則不能調用其上的getNum()。這些是編譯器的規則,而不是運行時的規則; A a實際上可能是C,但編譯器無法知道這一點。如果你想調用C的方法,例如你需要告訴編譯器aC((C)a).getNum();如果事實證明,a實際上不是一個C那麼你會得到一個運行時ClassCastException。爲了防止這種情況,你可以使用instanceof操作,

if(a instanceof C) 
    ((C)a).getNum(); 
else 
    // do something else 

但像投下這些往往是不好的設計的指示。但是,如果你真的想這樣做,那麼使用instanceof比趕上ClassCastException s要快很多(大約快一個數量級)。

+0

好吧,你說什麼不足以設置一個被聲明爲類型A的引用變量等於C的一個實例,我還必須將它轉換爲C來使用C的方法?並感謝你的實例提示:)我現在出去,但會給這個嘗試第二我回家!是的,並不是說它設計得很好,但是目前我還沒有做過很多的遊戲編程,而且我正在跟隨Java遊戲編程的黑色藝術,當他們開始談論精靈時,我撞到了那堵牆,而他們從來沒有談論它,所以我無法弄清楚。 –

+0

這是正確的,只要編譯器知道'A c = new C()'是一個'A',而不是'C',至少在你將它轉換爲'C'之前。 –

+0

非常感謝:) –