2013-03-29 53 views
0

首先我對這個問題的字眼感到抱歉,我不確定如何提問,但我可以更好地解釋它。當父類是引用類型並通過方法傳遞時,如何從子類訪問屬性?

我有一個父類和2個類中,只有一個是relavent的例子

public abstract class AudioFile{ //parent 
blah blah blah 
} //end class AudioFile 

public class MP3File extends AudioFile{ 
private int bitRate; //unique to MP3File class 
} //end class MP3File 

現在都說我是個MP3File對象,但其引用的AudioFile

public class Driver{ 
... // pretend main exists 
AudioFile file = new MP3File(); 
file.setBitRate(100); //pretend method exists 

edit(file); 

private void edit(AudioFile audio) 
{ 
//how would I edit the bit rate? 
} //end method edit 

} //end class Driver 
+2

如果您只需要MP3File和MP3File功能,那麼它應該是一個MP3File變量。 –

+0

Hovercraft所說的或者你可以將它轉換成更具體的類型,可能取決於一些不同的輸入(例如,作爲第二參數發送的枚舉)。 –

+0

它在你的示例函數中編輯比特率沒有任何意義,因爲它沒有任何比特率信息 - 是的,這是一個非常簡單的例子,我知道:)你可以把editBitrate函數放在抽象類型中,然後離開它在沒有意義的兒童課程中未實施? –

回答

1

真正的答案你的問題是「不要這樣做」。

MP3File是AudioFile的擴展;這應該意味着MP3File對象是AudioFile對象的一個​​特例,並且MP3File的唯一情況是MP3文件所特有的。

您的編輯方法將AudioFile作爲參數。根據您的示例,AudioFiles沒有bitRate參數。

如果你能夠將傳遞給編輯的參數轉換爲MP3文件,這仍然是一個壞主意。這意味着該方法正在處理MP3File對象,並且它不應該假設傳遞給它的任何AudioFile對象都可以轉換爲MP3File。