Java多类型变量

时间:2013-10-18 15:35:23

标签: java slick2d

我正在使用Slick2D创​​建一个简单的游戏,我有一个类是所有游戏对象的基础,它有一个Image变量。但是现在我想添加一个动画对象,所以我需要使用Animation类而不是Image类。

然而,尽管具有相同签名的方法(例如draw,getWidth,getHeight),但Image和Animation没有共同的超类。我知道它们都实现了Renderable,但这对getWidth或getHeight没有帮助。

那我怎么能有一个可以是Image或Animation类型的变量呢?

(在objective-c中,您可以使用类型为id的变量);

3 个答案:

答案 0 :(得分:1)

使用接口。如果这些是固定类,则重载ImageAnimation。然后,您可以通过界面集体引用这些类。

public class MyImageObject extends Image implements Drawable {
    public void draw() {
        this.builtInImageDrawMethod();
    }

    // implementations of getWidth() and getHeight()
}

public class MyAnimationObject extends Animation implements Drawable {
    public void draw() {
        this.builtInAnimationDrawMethod();
    }

    // implementations of getWidth() and getHeight()
}

public interface Drawable {
    public void draw();
    public int getWidth();
    public int getHeight();
}

public class Worker {
    public static void main(String[] args) {
        Drawable d1 = new MyImageObject();
        Drawable d2 = new MyAnimationObject();

        d1.draw();
        d2.draw();
    }
}

答案 1 :(得分:0)

您无法创建具有多种类型的变量。这对Java来说是不可能的。

但是,您可以创建自己的类层次结构,该层次结构委派给Slick2D类。例如,你可以做

public interface MyVisualObject {

    // List all the common methods here

}

public class MyImage {
    private Image img;

    public MyImage(Image img) {
        this.img = img;
    }

    // Implement the methods here. For example:
    public int getHeight() {
        return img.getHeight();
    }
}

您可以制作类似的MyAnimation课程。然后将变量声明为MyVisualObject,它可以是两个实现类之一的实例。

答案 2 :(得分:0)

在Java中,您没有Objective-C中的id类型。但是(正如其他人已经说过的那样)您可以定义自己的抽象类(或接口)并将Image属性替换为该类。然后只提供围绕您已经使用的类型的特定类型的实现。

public interface Graphic {
   public int getWidth();
   public int getHeight();
   // other methods
}

public class ImageGraphic implements Graphic {

   private final Image image;

   public ImageGraphic(Image image) {
      this.image = image;
   }

   public int getWidth() {
      return image.getWidth();
   }

   public int getHeight() {
      return image.getHeight();
   }

}

注意AnimationGraphic类将采用相同的方法。

我推荐这种方法而不是Tenner的方法,因为这样你的代码不依赖于将来可能不存在(或可能会改变)的扩展类。这样,当这些代码更改到达时,您只需要更少的代码来改变,而不是从库类扩展。