2017-06-22 38 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