2012-02-02 10 views
0

Imageというクラスと、それを拡張するクラスImageSheetというクラスがあります。クラスとサブクラスを同じように処理しましたか?

ImageSheetは、Imageと同じですが、画像のフレーム数などの追加フィールドがあります。

は、私は何をしたいので、私は drawImage(img, frame)を呼び出し、 imgを持っていることのいずれか Imageまたは ImageSheetとの唯一の違いは、それはだ場合 Imageその後、 frameフィールドは無視されるということで、同じ方法でそれらを処理することができ、それを持っています ImageSheetの場合は、 frameフィールドが読み込まれ、特定のフレームを描画するために使用されます。

私はすでに別の入力変数を受け入れる3つの異なる drawImage()方法を持っていると私は各クラスの1をした場合、私は方法の3つのペアを持っていると思いますので、私はそれが Imageまたは ImageSheetだ場合のために別の方法を避けるためにしようとしている

各対は本質的に全く同じである。

どうすればよいですか?

+0

は抽象クラスAbstractImageを持っています。抽象メソッドを追加して、この抽象クラスを拡張してイメージやイメージシートを呼び出すことができます – GustyWind

答えて

0

私はdrawImageメソッドは、メソッドの外画像/ ImageSheetであり、あなたが別の方法を回避している場合、あなたはinstanceofを使用してよいとのimgパラメータはimageSheetのインスタンスであるかどうかを確認することを前提としています。

+0

はいあなたは正しいです 'drawImage'はゲーム世界のレンダリングを扱うクラスのメソッドです。 'instanceof'は私が欲しいもののように聞こえるが、それを使うことには何か欠点があるのだろうか?通常、そのように便利なものはコストがかかり、パフォーマンスの問題を引き起こします。それは私が必要な場合それは貧しいデザインの兆候ですか? –

+0

私はそれがあなたが必要とするものを実行するためにタイプを知っている必要があるので、巨大なパフォーマンスの違いを引き起こすとは思わない。私の意見では、instanceofの使用は、オブジェクトのタイプが分かっている必要がある場合に実際に使用されるため、デザインが悪いという兆候ではありません。 – geneqew

1

Image/ImageSheetクラスでフレーム処理自体を処理しないのはなぜですか?

例えば、Imageクラスはその後で送信されたフレームのパラメータを無視し、あなたがするImageSheet固有のオブジェクトを望んでいたものは何でも処理でImageSheetプロセスを無効(フレーム)メソッドを持っていることをいくつかの方法という名前のプロセス(フレーム)を持っています。

void drawImage(Image img, Frame frame) { img.process(frame); } 

をし、それがImageImageSheetのかどうかに応じて、適切なことを行います。

次に、あなたが持つことができます。私はあなたの質問を正しく理解していることを願っています!

編集:

を明確にするためには、ここではそれぞれ、あなたのImageImageSheetクラスのためのコードです。

class Image { 
    ... 
    public void process(Frame frame) { 
    // do something 
    } 
} 

class ImageSheet extends Image{ 
    ... 
    // override process(Frame frame) method from Image 
    public void process(Frame frame) { 
    // do something different 
    } 
} 
+0

あなたの例で使用されている構文に精通していません。 –

+0

これをJavaの質問としてタグ付けしました。そうですね、このJavaメソッドの宣言/呼び出し構文は正しくありませんか? 'Image'クラス(ImageSheetクラスでオーバーライド)で定義したプロセスメソッドを呼び出しています。 – amfeng

+0

私はdrawImageが 'img.process(frame)'を呼び出す以外に何もしないことに混乱しました。なぜ 'process()'を直接呼び出さないのですか? –

1

イメージシートを拡張すると、drawImage(img, frame)メソッドの署名はdrawImage(Image img, Frame frame)でなければなりません。 ImageImageSheetオブジェクトを区別するために、instanceOf演算子を使用します。 例:

public void drawImage(Image img, Frame frame) { 
    if(img instanceof ImageSheet) { 
    // handle ImageSheet 
    } else { 
    // handle all other Image instances 
    } 
} 
0

私が理解から、drawImage(...)方法はImageImageSheet両方の外部にあります。この場合、潜在的な解決策の数があります

  • (これは論争かもしれない)Imageは全ての効果にあるフレームの固定数とImageSheet(1)。そのため、あなたはImageが異なっているかどうか気にする必要はありません。
  • このソリューションが適切でない場合は、ダブルレンダリングを使用することができます。すなわち、外部レンダリングエンティティが(おそらく他のバリアント)をImageクラスで宣言されています。すべてのサブクラス。これはVisitorパターンと似ています。
  • 最後に、外部レンダラーは使用せず、Imageは、実行するレンダリングのすべての可能な機能要求を入れることができるdrawImage(RenderingContext)メソッドを使用してレンダリングします。
+0

この記事は解決策につながっていない可能性があります。 – Ved

+0

あなたは詳しく説明できますか? –

+0

私はエンジン/フレームワークから抽象化されたゲーム世界を維持しようとしているため、そこに最後の箇条書きに同意しません。 (私はゲームを作っています)だから、将来はレンダラーを何か他のものに交換するだけで、ゲームの世界のコードをそのまま残すことができます。 –

関連する問題