我可以更改摘要 class 中变量的 class 吗
Can i change the class of an variable in an abstract class
在我当前的项目中,我有几个 class 继承自抽象 class 的变量。相似之处之一是它们都需要根据抽象的扩展 class 来计算新的特定控制器 class。这些 classes 也有很多相似之处,其中之一是它们保存了构建它们的对象。
现在我正在尝试为这些控制器 class 制作一个抽象 class,并且我制作了一个抽象变量 class 来创建它们。现在的问题是我需要这个控制器的实现 class 来将抽象创建者 class 更改为控制器的实现 class
这听起来真令人费解。我会写一个例子:
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();
}
这就是我的抽象控制器 class,我将写下扩展它的控制器示例 class。这个class需要保存一个扩展抽象GameObjectclass的对象。虽然,因为我很确定在构建这个 class 之后 '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
}
}
如何在不不断地将播放器变量转换为播放器的情况下执行此操作 class?
尝试泛型:
public abstract class ObjectController<T extends GameObject> {
protected T gameObject;
// ...
public ObjectController(T object, Game gameVersion) {
// ...
}
}
和
public class PlayerController extends ObjectController<Player> {
// ...
}
其中 T extends GameObject
表示您的 ObjectController
"knows" 关于扩展 GameObject
的类型,并将使用哪种具体类型的决定委托给其子类。
如果您 运行 遇到所有控制器的这个问题,我建议使用通用的:
abstract class ObjectController<T extends GameObject> {
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<Player> {
public PlayerController(Player object, Game gameVersion) {
super(object, gameVersion);
}
@Override
public void nextAction() {
//Work with your Player here
}
}
当你制作一个 extends ObjectController
的控制器时,你会强制 superclass 的 T gameObject
符合某种类型 instanceof GameObject
。这样,在通用 superclass 中提及的任何 T
都会成为您要使用的类型。
编辑:如果你想引用GameObject
的ObjectController
:
public class GameObject {
private ObjectController<? extends GameObject> controller;
//Getter/setter for controller
}
如果愿意,您甚至可以在 GameObject
的构造函数中实例化 controller
。
通配符 ?
或多或少告诉编译器这个泛型将在运行时 "be of some class instanceof GameObject
" 。如果您在编码时意识到 class 类型,那么使用通配符可能会有点困难,但是因为您知道每个控制器的通用类型都是 GameObject
的 class ,您应该可以通过 object.getController()
.
轻松访问它
在我当前的项目中,我有几个 class 继承自抽象 class 的变量。相似之处之一是它们都需要根据抽象的扩展 class 来计算新的特定控制器 class。这些 classes 也有很多相似之处,其中之一是它们保存了构建它们的对象。
现在我正在尝试为这些控制器 class 制作一个抽象 class,并且我制作了一个抽象变量 class 来创建它们。现在的问题是我需要这个控制器的实现 class 来将抽象创建者 class 更改为控制器的实现 class
这听起来真令人费解。我会写一个例子:
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();
}
这就是我的抽象控制器 class,我将写下扩展它的控制器示例 class。这个class需要保存一个扩展抽象GameObjectclass的对象。虽然,因为我很确定在构建这个 class 之后 '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
}
}
如何在不不断地将播放器变量转换为播放器的情况下执行此操作 class?
尝试泛型:
public abstract class ObjectController<T extends GameObject> {
protected T gameObject;
// ...
public ObjectController(T object, Game gameVersion) {
// ...
}
}
和
public class PlayerController extends ObjectController<Player> {
// ...
}
其中 T extends GameObject
表示您的 ObjectController
"knows" 关于扩展 GameObject
的类型,并将使用哪种具体类型的决定委托给其子类。
如果您 运行 遇到所有控制器的这个问题,我建议使用通用的:
abstract class ObjectController<T extends GameObject> {
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<Player> {
public PlayerController(Player object, Game gameVersion) {
super(object, gameVersion);
}
@Override
public void nextAction() {
//Work with your Player here
}
}
当你制作一个 extends ObjectController
的控制器时,你会强制 superclass 的 T gameObject
符合某种类型 instanceof GameObject
。这样,在通用 superclass 中提及的任何 T
都会成为您要使用的类型。
编辑:如果你想引用GameObject
的ObjectController
:
public class GameObject {
private ObjectController<? extends GameObject> controller;
//Getter/setter for controller
}
如果愿意,您甚至可以在 GameObject
的构造函数中实例化 controller
。
通配符 ?
或多或少告诉编译器这个泛型将在运行时 "be of some class instanceof GameObject
" 。如果您在编码时意识到 class 类型,那么使用通配符可能会有点困难,但是因为您知道每个控制器的通用类型都是 GameObject
的 class ,您应该可以通过 object.getController()
.