[英]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()
)。
您可以为此使用反射...但是为CustomPlayer
和CurrentPlayer
拥有一个通用的超类(或接口)会不会更简单吗?
例如,假设CustomPlayer
和CurrentPlayer
都具有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.