2017-06-22 126 views
0

我有一個名爲CoordMediaPlayer的類繼承MediaPlayer。我CoordMediaPlayer必須能夠使用MediaPlayer方法,所以這就是爲什麼我使用繼承...繼承和MediaPlayer

的問題是,以實例化一個MediaPlayer它必須使用MediaPlayer.create()靜態方法。這不像是它只是調用構造函數,然後我可以正常使用父類的方法。如果我從MediaPlayer繼承,我不能從繼承MediaPlayer的類訪問create()方法我猜是因爲它是靜態方法,我不能覆蓋它。

在理想的我想有我CoordMediaPlayer,這CoordMediaPlayer不會包含MediaPlayer對象,但我將能夠全部MediaPlayer方法直接從CoordMediaPlayer實例調用。如果我在我的CoordMediaPlayer中沒有相同類型的靜態create()方法,則會更好,當創建我的CoordMediaPlayer時會完成此創建。

的只有一條路,我發現解決這個問題,就是有一個MediaPlayer對象在我CoordMediaPlayer,然後我CoordMediaPlayer繼承MediaPlayer,只是通過調用我的MediaPlayer對象的方法來覆蓋所有我需要的方法...但是這對我來說有點奇怪......有沒有其他方法可以處理這種情況,而我的CoordMediaPlayer中沒有MediaPlayer,而是直接調用我繼承的MediaPlayer方法?

這是我如何解決這個問題,從MediaPlayer的,並在同一時間我CoordMediaPlayer類繼承包含的MediaPlayer的實例,並具有覆蓋我想用MediaPlayer的所有方法...

活動

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    context = getApplicationContext(); 

    int fileResId = context.getResources().getIdentifier("s2", "raw", context.getPackageName()); 
    CoordMediaPlayer cmp = new CoordMediaPlayer(context,fileResId); 
    cmp.start(); 
} 

CoordMediaPlayer

public class CoordMediaPlayer extends MediaPlayer { 
    private MediaPlayer mediaPlayer; 
    private Point coordinates; 

    @Override 
    public void start() throws IllegalStateException { 
     mediaPlayer.start(); 
    } 

    public CoordMediaPlayer(Context context, int resId) { 

     mediaPlayer = MediaPlayer.create(context,resId); 
    } 

    public void setCoordinates(Point coordinates) { 
     this.coordinates = coordinates; 
    } 

    public Point getCoordinates() { 
     return coordinates; 
    } 
} 

回答

1

MediaPlayer類實際上有public costructor,所以你不必使用create(..)方法來建立。文檔僅建議在某些情況下使用靜態方法。

順便說一句,你在你的問題中說明的方法被稱爲「組成」,是合法的,通常被認爲是比繼承更好的方法。檢查這個stackoverflow響應:Prefer composition over inheritance?

但是我會建議更多地考慮原因,爲什麼您認爲您需要從MediaPlayer類繼承,就您的情況而言。我真的認爲你不需要,你可以使用自己的類封裝MediaPlayer實例,並將它自己的api提供給其他應用程序。

+0

該死的......我看到關於使用MediaPlayer的所有示例都使用了靜態方法,所以我甚至沒有想過檢查是否存在公共構造函數......您與組合/繼承的鏈接也是有用和有趣的。謝謝你的回答,這非常有幫助。 – Laurent