2017-06-22 8 views
0

MediaPlayerを継承するCoordMediaPlayerというクラスがあります。私CoordMediaPlayer問題は、それがMediaPlayer.create()静的メソッドを使用する必要がありますMediaPlayerをインスタンス化することである継承とMediaPlayer

...私は、継承を使用する理由それはですのでMediaPlayerの方法を使用することができなければなりません。コンストラクタを呼び出しただけでは親クラスのメソッドを正常に使うことはできません。 MediaPlayerから継承した場合、MediaPlayerを継承するクラスのcreate()メソッドにアクセスすることはできません。静的メソッドであるため、オーバーライドできません。私は私のCoordMediaPlayerを持ってしたいと思う理想的で

、このCoordMediaPlayerMediaPlayerオブジェクトが含まれていないだろうが、私はCoordMediaPlayerインスタンスから直接すべてのMediaPlayerメソッドを呼び出すことができるでしょう。私のCoordMediaPlayerに同じ種類の静的なcreate()メソッドを持たない方が良い場合は、CoordMediaPlayerをインスタンス化するときにこの作成が行われます。

私はこの問題に対処することが分かっ唯一の方法は、MediaPlayerから、その後の私のCoordMediaPlayer継承、私CoordMediaPlayerMediaPlayerオブジェクトを持っていると私は私のMediaPlayerオブジェクトのメソッドを呼び出すことで、単に必要なすべてのメソッドをオーバーライドすることです...しかし、それは私には奇妙に見える...私のCoordMediaPlayerMediaPlayerを持たずに、この種の状況に対処する他の方法がありますが、私の継承したMediaPlayerメソッドを直接呼び出すのですか?

これは私がこれに対処する方法、私のCoordMediaPlayerクラスは、MediaPlayerの継承と同時に、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

Damned ...私がMediaPlayerを静的メソッドで使用しているのを見たので、パブリックコンストラクタがあるかどうかをチェックすることさえできませんでした...コンポジション/継承へのあなたのリンクも便利で面白いです。あなたの答えをありがとう、それは非常に有用だった。 – Laurent