2015-04-19 61 views
0

我有一個超類動物,由貓延長,狗&獅子。這三個都有代表他們聲音的字段String sound。 playSound(int i,String s)方法播放聲音s,i次數。是否有可能在動物超類中有一個通用方法來接收子類的字段呢?或者我必須在每個類中使用自己的「聲音」變量調用super的單獨重寫方法?是否有可能從Java的超類中調用子類的實例變量?

+2

FWIW:您不「調用」變量,您「使用」或「訪問」或「讀取」或「寫入」或「分配給」等。你*調用函數/方法/構造函數。 –

回答

0

超級無權訪問子的字段,也不應該 - 超類應該沒有依賴於他們的孩子 - 但多虧了多態,它不需要。所有你需要做的就是給超級方法makeSound()或類似的東西,然後讓子重寫方法,每個方法都播放自己的聲音。

重,

還是我不得不在每一個與自己的調用父類獨立的,壓倒一切的方法「聲音」變量?

我不明白你的意思是「那叫超級...」。您只需在makeSound()方法覆蓋範圍內使用子呼叫自己的聲音。

+0

我的意思是說,如果我在Animal中有一個makeSound(int i,String s)方法,它有適用於所有東西的代碼,但是根據s改變輸出,在子類中我應該只有另一個makeSound(int i,String s)方法調用超級,傳遞它我int和他們自己的聲音變量? – platelminto

+0

@platelminto:你應該有一個makeSound方法,它不接受一個String,而是它的String由子類提供。 –

6

父類不能訪問子類中的字段。這裏通常的做法是做一個抽象的吸氣劑:

protected abstract Sound getSound(); 

public void playSound(int times) { 
    for(int i=0; i<times; i++) { 
     getSound().play(); 
    } 
} 
0

據我所知,不,這是不可能的。你可以嘗試在超類中進行比較,比如

if (this intanaceof of Cat) 
play cat sound 

但是那樣會打破多態的目的。我不明白你爲什麼想這樣做。我會這樣做:

abstract class Animal{ 

Sound [] sounds; 
int soundI; 

Animal(int soundI){ 
this.soundI = soundI 
} 

void playSound(){ 
sounds[i].play(); 
} 

} 

class Cat extends Animal{ 

Cat(){ 
super(5); 
} 

} 
+0

不好的想法做intanaceof,大多數時候總是有一個更好的方法。在這種情況下,最好的解決方案是抽象方法。 –

相關問題