2012-12-27 192 views
1

我有兩個類:TeacherCoordinatorCoordinator延伸TeacherJava鑄造對象

基本上我想要一個實例變量,可以採取Teacher實例或Coordinator實例。

我知道這是很容易可以通過只寫Teacher exp = new Teacher()Teacher exp = new Coordinator(),但是當我這樣做,我只能當我申請new Coordinator()new Teacher()的參考變量是正常訪問Teacher方法和屬性。我的問題是,還有另一種方法,我只使用一個實例變量,可以分配給教師或協調員對象,並使用此變量來調用分配給對象引用變量的對象的任何屬性/方法?

+0

你意識到類可以從現有的類擴展。你已經編寫的代碼如何預測你沒有擴展的類的方法?反射API是唯一的理智機制。其他選項是編寫可保證指定所需類的協議的接口。 –

+0

你如何知道它是否是「協調員」? – MrSmith42

回答

8

您可以檢查是否EXP是Coordinator再抹上並調用其功能相應:

if(exp instanceof Coordinator) { 
    ((Coordinator)exp).foo(); 
} 

如果您想要做幾件事情,你可以在本地範圍內創建一個變量反覆使用:每當你要撥打的Coordinator方法

if(exp instanceof Coordinator) { 
    Coordinator expCoord = (Coordinator)exp; 
    expCoord.foo(); 
    expCoord.bar(); 
    expCoord.baz(); 
} 
+0

那麼做完這個之後,'Teacher exp'(被分配給一個協調器對象)會永久成爲'Coordinator exp'嗎? –

+1

不可以。它只適用於第一個示例中的表達式或第二個示例中的該範圍。 – Dennis

0

,你就必須將對象轉換爲Coordinator第一。

((Coordinator)myTeacher).coordinatorMethod(); 
0

不,因爲類型安全。但你總是可以這樣做:

Teacher exp = new Coordinator() 
((Coordinator)exp).someCoordinatorMethodOrProperty() 
1

沒有辦法做到這一點,除非你想調用的所有方法都出現在父類中。

您可以將教師變量中的內容轉換爲協調員,但如果教師變量中的內容不是真正的協調員對象實例,則會失敗。

((Coordinator)exp).coordinate(); 
0

是的,你是正確的,

這裏同一個概念實現爲父子關係 由於子類的實例可以訪問孩子的財產,以及父母雙方,但只有父母類訪問實例兒童班的財產...

這就是爲什麼它發生。