继承和 MediaPlayer

Inheritance and MediaPlayer

我有一个名为 CoordMediaPlayer 的 class,它继承自 MediaPlayer。我的 CoordMediaPlayer 必须能够使用 MediaPlayer 方法,所以这就是我使用继承的原因...

问题是要实例化 MediaPlayer 它必须使用 MediaPlayer.create() 静态方法。这不像它只是调用构造函数然后我可以正常使用父 class 的方法。如果我从 MediaPlayer 继承,我无法从继承 MediaPlayer 的 class 访问 create() 方法,我想因为它是静态方法,所以我无法覆盖它。

理想情况下,我希望拥有我的 CoordMediaPlayer,这个 CoordMediaPlayer 不会包含 MediaPlayer 对象,但我可以直接调用所有 MediaPlayer 方法来自 CoordMediaPlayer 个实例。如果我的 CoordMediaPlayer 中没有相同类型的静态 create() 方法会更好,这个创建将在我实例化我的 CoordMediaPlayer.

时完成

我发现处理这个问题的唯一方法是在我的 CoordMediaPlayer 中有一个 MediaPlayer 对象,然后我的 CoordMediaPlayer 继承自 MediaPlayer 并覆盖我需要的所有方法只需调用我的 MediaPlayer 对象的方法...但这对我来说看起来有点奇怪...有没有其他方法可以处理这种情况,而无需 MediaPlayer 在我的 CoordMediaPlayer 中,但直接调用我继承的 MediaPlayer 方法?

这就是我处理这个问题的方式,我的 CoordMediaPlayer class 继承自 MediaPlayer,同时包含一个 MediaPlayer 的实例,并且必须覆盖我想使用的 MediaPlayer 的所有方法...

Activity

@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();
}

坐标媒体播放器

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;
    }
}

MediaPlayer class actually has public costructor 所以你不必使用 create(..) 方法来构造。文档仅建议在某些情况下使用静态方法。

顺便说一句,您在问题中说明的方法称为 "composition",它是合法的,通常被认为是比继承更好的方法。检查此 Whosebug 响应:Prefer composition over inheritance?

不过,我建议您多考虑一些原因,在您的情况下,为什么您认为需要从 MediaPlayer class 继承。老实说,我认为你不需要,你可以只使用自己的 class 封装 MediaPlayer 实例并将它自己的 api 提供给你的应用程序的其余部分。