繁体   English   中英

具有2种不同类型的对象数据

[英]Object data with 2 different types

我有以下内容:

public class Notifier{
    CustomPlayer mCustomPlayer;
    CurrentPlayer mCurrentPlayer;
}

public class MainActivity extends Activity{

    public void onCreate(){
        Notifier ntf = new Notifier();
        if( index == 0){
            ntf.mCustomPlayer = new CustomPlayer(this);
        }
        else{
            ntf.mCustomPlayer = new CurrentPlayer(this); // having problem here
        }
    }
}

在Notifier类中,我只想让一个对象mCustomPlayer在MainActivity类中的CustomPlayer和CurrentPlayer之间切换。

我尝试在Notifier类中添加以下内容,

public class Notifier{
    CustomPlayer mCustomPlayer;
    CurrentPlayer mCurrentPlayer;

    public Object getType(int index) {
        if (index == 1) {
            return CurrentPlayer.class;
        }
        else {
            return CustomPlayer.class;
        }
    }
}

这样,尝试在MainActivity类中初始化mCustomPlayer时遇到问题。

ntf.mCustomPlayer = new (ntf.mCustomPlayer)getType(0); // compile error

有没有办法实现这一目标?
自从我尝试配置正确的实现以来已经过了一天。
在这种情况下应该使用接口吗?

要使用new关键字,您必须提供一个类(即new MyClass() )。

可以为此使用反射...但是为CustomPlayerCurrentPlayer拥有一个通用的超类(或接口)会不会更简单吗?

例如,假设CustomPlayerCurrentPlayer都具有playOne()playTwo()方法。 然后,您可以定义:

public interface Player {
    void playOne();
    void playTwo();
}

public class CurrentPlayer implements Player {
    @Override
    public void playOne() { 
        // code
    }

    @Override
    public void playTwo() {
        // code
    }
}

private class CustomPlayer implements Player {
    @Override
    public void playOne() {
        // code
    }

    @Override
    public void playTwo() {
        // code
    }
}

public class Notifier {
    Player mPlayer;
 }

然后为mPlayer分配new CurrentPlayer()或新的CustomPlayer()然后,您可以在接口上调用任何方法。

您可以使用反射:

public class Notifier{

    public CommonInterface getInstance(int index, Class<Activity> activity){
      Class<?> claz = getType(0);
      Constructor<?> cons = claz.getConstructor(activity);
      return (CommonInterface) cons.newInstance(this);
      //or you could just type cast it manually if you do not wish to use CommonInterface
}

但是拥有通用接口是正确的方法。 您不必担心反射。

由于两个类的功能相同,因此请使用interface并访问对象-

public class MainActivity extends Activity{
    interface CurrentPlayer  { void game(); }
    interface CustomPlayer   { void game(); }

    interface Player extends CurrentPlayer, CustomPlayer { }

     public void onCreate(){
        Player swan = new Player() {
            @Override 
            public void game() {
                System.out.println("Swan Player");  //Swan Player
            }
        };
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM