我正在使用Slick2D创建一个简单的游戏,我有一个类是所有游戏对象的基础,它有一个Image变量。但是现在我想添加一个动画对象,所以我需要使用Animation类而不是Image类。
然而,尽管具有相同签名的方法(例如draw,getWidth,getHeight),但Image和Animation没有共同的超类。我知道它们都实现了Renderable,但这对getWidth或getHeight没有帮助。
那我怎么能有一个可以是Image或Animation类型的变量呢?
(在objective-c中,您可以使用类型为id的变量);
答案 0 :(得分:1)
使用接口。如果这些是固定类,则重载Image
和Animation
。然后,您可以通过界面集体引用这些类。
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的方法,因为这样你的代码不依赖于将来可能不存在(或可能会改变)的扩展类。这样,当这些代码更改到达时,您只需要更少的代码来改变,而不是从库类扩展。