2

簡単なゲームを開発しています。Maze迷路を作成/変更/解決するためのメソッドとアルゴリズムを含むクラスを作成しました。また、に迷路を描くためGraphicalMazeのメソッドのみを含むクラスを作成しました。paintJPanel

この時点で、私は次のことを決定する必要があります。

  • GraphicalMazeメンバー変数(継承)としてMaze、を拡張する必要がありますJPanel

また

  • GraphicalMazeメンバー変数(構成)としてJPanel、を拡張する必要がありますMaze

この問題は、「抽象」オブジェクトから「gui」オブジェクトを作成する必要があるたびに再発します。私はあなたの意見に興味があります、そして私は進むための「正しい」方法が何であるかを理解したいと思います。

4

4 に答える 4

2

GraphicalMaze描画することが唯一の理由である場合は、メソッドをクラスMazeに含める必要があります。Maze私は通常メソッドdrawを呼び出しますが、paint機能します。

JComponentメソッドをオーバーライドする場合にのみ、を拡張する必要があります。それ以外の場合は、JComponentをメンバー変数として使用することをお勧めします。

継承をめぐる構成。

あなたの特定のケースでは、私はあなたのクラスのメソッドを呼び出すためにメソッドを拡張JPanelしてオーバーライドします。クラスのインスタンスを拡張クラスに渡す必要があります。paintComponentpaintMazeMazeJPanel

于 2013-01-18T19:48:47.240 に答える
1

これは、答えるのが最も簡単または最も客観的な質問ではありません。ほとんどの場合、継承よりもコンポジションを優先すべきだと言う傾向がある人もいます。私は、あなたのオブジェクトとそれらが実際に互いにどのように関連しているかについて考えてください。この場合、継承はis-a関係を表し、コンポジションはhas-aを表すことに注意してください。

それで、問題は、次のようになります-GraphicalMaze a Maze?それとも迷路の表現ですか?私は後者について議論します。もちろん、これは、継承ではなく構成を使用して表現することを意味します。

于 2013-01-18T19:49:38.040 に答える
0

私はオプション番号2で行きます。GraphicalMazeは表示を変更するクラスですが、Mazeには表示されるデータが含まれているため、GraphicalMazeはグラフィックスとより密接な「接続」を持っている必要があります。

于 2013-01-18T19:48:20.313 に答える
0

あなたのGraphicalMazeオブジェクトは迷路を表示するパネルであると思います。それをのサブクラスとして扱うことで、グラフィカルアプリケーションに合わせるのが簡単になると思いますJPanel。その場合、私自身の解決策は拡張することJPanelですが、新しいクラスをMazePanelではなくのようなものと呼びますGraphicalMaze

そうは言っても、この質問に頻繁に直面する場合は、両方の方法で実装してみて、どちらがより使いやすいアプリケーション構造につながるかを確認することは、おそらく努力する価値があります。

于 2013-01-18T20:15:49.547 に答える