继承和 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 提供给你的应用程序的其余部分。
我有一个名为 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 提供给你的应用程序的其余部分。