Javaで親クラスなど、さまざまな子クラスを保存することが悪いです

パトリック・アンダーソン:

それは彼らの親クラスとしてストアオブジェクトに悪い習慣を考慮し、サブクラスにキャストに期待クラスに()object.getClassを比較しています。

説明:タイルベースの動きに2Dゲームの一部として、私は「ゲームオブジェクト」のいくつかのタイプを持っている等、それぞれが2次元配列を作るに格納された「ポータル」、「プレイヤー」、「NPC」、「胸」、のようなオブジェクトまた、更新およびレンダリングキューとゲームオブジェクトとして機能し、各レベルは、レベルが必要とする情報を体現しています。私は親の型ゲームオブジェクトとしてのすべてのオブジェクトを保存する場合は、(プレイヤークラスで)例えば、実際のクラスにそれらをキャスト:

private void checkPosition(x, y) {
    GameObject obj = Level.getObject(x,y);
    if(obj instanceof NPC) {
       NPC npc = (NPC)obj;
       //interact with npc
    } else if(obj instanceof Chest) {
       //handle chest
    }
}

これは、一般的に読みにくいでしょうか?何の問題私はおそらくこのようなことをやって持っているのですか?任意の提供される各オブジェクトが相互作用する配列を使用して、私はおそらく、将来的には根本的に異なる機能を持つそれぞれの「ゲームオブジェクト」の他の種類を持っているかどう何より良い方法でしょう。

私はこの質問を説明するのか本当にわからないと申し訳ありませんが、これは長ったらしいある場合。

編集:私は、同様のコードはゲームオブジェクトの他のサブクラス、プレイヤー(すなわちNPC以降クラス)だけでなく、から実行することができると強調し、各保存レベルのクラスを変更することなく、各サブクラス間の相互作用を変更することができることにある明確にすべきそれは潜在的に保存されているクラスタイプが作成された/変更の時間1。推奨人にありがとうinstanceof、私は他の部分に焦点を当てるために、質問を更新しましたが、私はおそらく今からそれを使用することになります。フィードバックをお寄せいただきありがとうございます。

結論:私は、それぞれのゲームオブジェクトが言及したインタフェースのスタブ/アダプタを拡張し、独自のAIサブクラスを持つdaniuの答えのバリアントのために行くことにしました。したがって、私は、同じオブジェクトタイプに異なる動作を与えることができ、これまでのクラスの反応を実装する必要はありませんとの相互作用を処理することは、次のようになります。

getObject(x,y).getAI().react(obj);
料理:

これは、訪問者のパターンのためのユースケースです。

(レベル間を移動するすべてのための)インターフェースを追加

interface LevelCrawler {
   void accept(Chest chest);
   void accept(NPC npc);
}

そしてあなたへ GameObject

interface GameObject { // or abstract class
    // added method
    void accept(LevelCrawler lc);  // abstract if class
}

LevelCrawler例えばによって実施されるPlayer(またはクラスをNPC、あなたの編集に説明するようになど)。

class Player implements LevelCrawler {
   public void accept(Chest chest) { ... }
   public void accept(NPC npc) { ... }
}

内のコードを含むif () {...}ブロック。

次に、あなたが持っている例

class Chest implements GameObject {  // I think it's a class, so probably "extends"
    void accept(LevelCrawler p) { p.handle(this); } // to call Player#handle(Chest)
}

そして、あなたのコードは次のようになります

GameObject o = Level.getObject(x, y);
o.accept(player); // or NPC or whatever is moving right now

ルックは、それが動作します

この方法の利点は、あなたが新しい作成するときにということであるGameObjectクラスを、あなたは簡単に既存の新しい動作を追加することができLevelCrawler、クラスとのままcheckPosition変わらないコードを。

バージョンを編集し、両方とPlayerし、NPCダンジョン内を移動。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=477390&siteId=1