在我当前的项目中,我有几个类从抽象类继承变量.相似之处之一是,它们都需要根据抽象类的扩展来计算新的特定控制器类.这些类也有许多相似之处,其中之一是它们保存了构造它们的对象.
现在,我试图为这些控制器类创建一个抽象类,并且为该抽象类创建了一个变量来创建它们.现在的问题是,我需要我的控制器类的实现才能将抽象创建者类更改为控制器类的实现
这听起来真令人困惑.我将写下一个示例:
public abstract class ObjectController {
protected GameObject gameObject;
protected Game gameVersion;
public ObjectController(GameObject object, Game gameVersion){
this.gameObject = object;
this.gameVersion = gameVersion;
}
public abstract void nextAction();
}
这就是我的抽象Controller类,我将写下扩展该类的Controller类的示例.此类需要保存一个扩展抽象GameObject类的对象.虽然,由于我非常确定在构造此类之后,’gameObject’变量会填充有GameObject的特定扩展名,所以我想使用只有该扩展名才能执行的该变量来完成操作.
public class PlayerController extends ObjectController {
int speed = 0;
public PlayerController(Player player, Game gameVersion{
super(player, gameVersion)
}
public void updateSpeed(){
speed = player.getSpeed() // example of a method only the Player class has
}
}
如何在不将player变量不断转换为Player类的情况下执行此操作?
解决方法:
如果您的所有Controller都遇到此问题,建议您使用通用的:
abstract class ObjectController {
protected T gameObject;
protected Game gameVersion;
public ObjectController(T object, Game gameVersion){
this.gameObject = object;
this.gameVersion = gameVersion;
}
public abstract void nextAction();
}
class PlayerController extends ObjectController {
public PlayerController(Player object, Game gameVersion) {
super(object, gameVersion);
}
@Override
public void nextAction() {
//Work with your Player here
}
}
当您制作一个扩展ObjectController的控制器时,您将强制超类的T gameObject符合某些类型,即GameObject的实例.这样,泛型超类中对T的任何提及都将成为您要使用的类型.
编辑:如果要引用GameObject的ObjectController:
public class GameObject {
private ObjectController extends GameObject> controller;
//Getter/setter for controller
}
如果愿意,您甚至可以在GameObject的构造函数中实例化控制器.
通配符?或多或少地告诉编译器,该泛型将在运行时“属于GameObject的某些类instanceof”.如果您在编码时意识到类的类型,通配符可能会有点难工作,但是由于您知道每个控制器的通用类型都是GameObject的类的通用类型,因此您应该能够通过object.getController( ).
标签:casting,inheritance,java,class,abstract
来源: https://codeday.me/bug/20191026/1938340.html