0

私は Slick2D を使用して単純なゲームを作成しています。すべてのゲーム オブジェクトのベースとなるクラスがあり、Image 変数があります。しかし、アニメーション化されたオブジェクトを追加したいので、Image クラスではなく Animation クラスを使用する必要があります。

ただし、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

idJava では、Objective-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次に、2 つの実装クラスのいずれかのインスタンスになる変数を宣言します。

于 2013-10-18T15:44:56.547 に答える