代码之家  ›  专栏  ›  技术社区  ›  Typhaon

我可以在抽象类中更改变量的类吗

  •  3
  • Typhaon  · 技术社区  · 8 年前

    在我当前的项目中,我有几个类从抽象类继承变量。一个相似之处是,它们都需要调用一个新的特定控制器类,基于它们是抽象类的扩展。这些类也有很多相似之处,其中之一是它们保存了构造它们的对象。

    这听起来真的很令人困惑。我将写下一个例子:

    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();
    }
    

    这就是我的抽象控制器类,我将写下一个控制器类的例子,它扩展了这个类。这个类需要保存一个扩展抽象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类?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Zircon    8 年前

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

    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 在中 游戏对象 的构造函数。

    通配符 ? 或多或少地告诉编译器,这个泛型将“属于某个类” 游戏对象实例 “在运行时。如果您在编码时意识到类类型,那么通配符可能会有点难以使用,但因为您知道每个控制器的泛型类型都是 游戏对象 的类,您应该能够通过 object.getController() .

        2
  •  1
  •   Smutje    8 年前

    尝试泛型:

    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 GameObject