0

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

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

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

(在objective-c中,你可以有id类型的变量);

4

3 回答 3

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();
    }
}
于 2013-10-18T15:38:15.057 回答
1

在 Java 中,您没有idObjective-C 中的类型。但是(正如其他人已经说过的)您可以定义自己的抽象类(或接口)并用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 的方法,因为这样你的代码不依赖于扩展未来可能不存在(或可能改变)的类。这样,当这些代码更改到达时,您几乎不需要更改代码,而且比从库类扩展更容易。

于 2013-10-18T15:47:12.763 回答
1

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

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

public interface MyVisualObject {

    // List all the common methods here

}

public class MyImage implements MyVisualObject {
    private Image img;

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

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

你可以做一个类似的MyAnimation课程。然后声明一个变量,MyVisualObject它可以是两个实现类中的任何一个的实例。

于 2013-10-18T15:44:56.547 回答