我可以在抽象类

时间:2016-09-19 13:57:19

标签: java class inheritance casting abstract

在我目前的项目中,我有几个类从一个抽象类继承变量。其中一个相似之处在于它们都需要根据抽象类的扩展来为新的特定控制器类进行校准。这些类也有很多相似之处,其中之一就是它们保存了哪个对象构造了它们。

现在我正在尝试为这些控制器类创建一个抽象类,并且我创建了一个创建它们的抽象类的变量。现在的问题在于我需要我的控制器类的实现来将抽象创建器类更改为控制器类的实现

听起来真的很混乱。我会写一个例子:

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类,我将写下一个扩展它的控制器类的例子。此类需要保存扩展抽象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类,我该怎么做?

2 个答案:

答案 0 :(得分:3)

如果您与所有控制器一起遇到此问题,我建议使用通用:

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的控制器时,你强迫超类的T gameObject符合instanceof GameObject的某种类型。这样,通用超类中对T的任何提及都会成为您想要使用的类型。

修改:如果您想引用GameObject ObjectController

public class GameObject {
    private ObjectController<? extends GameObject> controller;

    //Getter/setter for controller
}

如果愿意,您甚至可以在controller的构造函数中实例化GameObject

通配符?或多或少地告诉编译器这个泛型将属于某个类instanceof GameObject&#34;在运行时。如果您在编码时意识到类类型,那么通配符可能有点难以使用,但是因为您知道每个控制器的通用类型是GameObject的通用类型在课堂上,您应该可以通过object.getController()轻松访问它。

答案 1 :(得分:1)

尝试泛型:

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&#34;知道&#34;关于扩展GameObject的类型的东西,并将决定使用的具体类型委托给它的子类。