3

私はJavaが初めてです。パス検索に関する情報を読んだだけで、空のクラスをinterface不明なオブジェクト タイプの " " として使用する方法について読みました。

病院をテーマにした Java でゲームを開発しています。これまでのところ、ユーザーは受付と GP のオフィスを構築できます。それらは 2 つの異なるタイプのオブジェクトであり、1 つは で、Buildingもう 1 つはReceptionDeskです。(私のクラス構造では。)

私のクラス構造はこれです:

GridObject-->Building
GridObject-->Item-->usableItem-->ReceptionDesk.

問題は、使用可能なアイテムが回転でき、建物が回転できない場合に発生します。マウス クリック イベントはグリッド上にあるため、同じメソッドを呼び出します。GP のオフィスは でBuilding、受付はReceptionDeskです。のみReceptionDeskメソッドがありrotateます。グリッドを右クリックするとき、構築モードの場合、次の「if」ステートメントを使用する必要があります。

if (currentBuilding.getClass.equals(ReceptionDesk.getClass)

次に、新しい を作成しReceptionDesk、メソッドを使用して、rotateその受付デスクを に戻す必要がありcurrentBuilding GridObjectます。

この質問で自分自身をうまく説明できているかどうかわかりません。ごめん。私はまだJavaにかなり慣れていません。質問があればお答えします。必要に応じてコード スニペットを投稿できます。オブジェクトのクラスがわからないという問題を回避する方法があるかもしれないとは知りませんでしたが、間違った方法で行っている可能性もあります。

このサイトの返信がどれほど速くて役立つかを見るまで、これを調べるつもりはありませんでした! :)

前もって感謝します。

リリース

4

3 に答える 3

7

あなたの場合、何かをする前にオブジェクトのクラスをチェックしたくありません。polymorphismを使用する必要があります。インターフェイスにいくつかのメソッドを定義させたいとします。各クラスはこれらのメソッドを実装します。インターフェイスによってオブジェクトを参照し、それらのオブジェクトの個々の実装が呼び出し元に値を返すようにします。

あなたが必要だと思うオブジェクトをもう少し説明すると、ここの人々はそれらをどのように配置すべきかについて意見を述べるでしょう. しかし、あなたが提供したものから、いくつかの一般的なメソッドを定義する「構築」インターフェースが必要になる場合があります。「UsableItem」インターフェースまたはより一般的なものが必要になる場合もあります。Hospital は、建物を実装するクラスである可能性があります。ReceptionDesk は UsableItem を実装できます。建物は、その中に UsableItem のグリッドを持つことができます。

もし、rotate() が、実際に何らかの作業を行ったすべての家具に共通のメソッドである場合、UsableItem を実装する抽象クラスである AbstractUsableItem クラスを作成し、rotate() メソッドを提供することを検討できます。実装するクラスごとに回転が異なる場合、インターフェイスにそのメソッドがありますが、ReceptionDesk などの各クラスは、rotate() メソッドを使用して独自のことを行います。あなたのコードは次のようになります:

UsableItem desk = new ReceptionDesk();
desk.rotate()

あなたの例では、画面をマウスでクリックするとその下のオブジェクトが回転し、そのようなことをする前にオブジェクトを回転できるかどうかを確認する必要があった場合は、そうします

if (clickedObject instanceOf UsableItem) {
  ((UsableItem) clickedObject).rotate();
}

UsableItem はインターフェイスまたは抽象クラスです。一部の人々は、すべての設計はインターフェイス コントラクトを介して行う必要があり、すべてのタイプのクラスにインターフェイスを提案する必要があると考えていますが、そこまでする必要があるかどうかはわかりません。

于 2009-04-09T22:18:10.593 に答える
3

まったく異なる方向に移動し、オブジェクト自体に実行するアクションの種類を決定させることを検討してください。たとえば、GridObjectインターフェイスは、handleRightClick()、handleLeftClick()などの関数宣言を指定する場合があります。その場合、「GridObjectを呼び出すクラスは、右クリックしたときに何が起こるかを指定する必要があります。 "。

したがって、Buildingクラス内で、handleRightClickを実装して何もしない(またはエラーを返す)場合があります。ReceiveDeskクラス内で、handleRightClickを実装してデスクを回転させます。

コードスニペットは次のようになります。

currentBuilding.handleRightClick(... any necessary parameters ...);
于 2009-04-09T22:46:06.347 に答える
1

あなたが心配するのは正しいです。オブジェクト指向設計の経験則として、if(x instanceof Y)またはのような構造を使用するときはいつでもif(x.getClass().equals(Y.class))、メソッドを上下に移動するか、新しいメソッドを抽出することについて考え始める必要があります。

エリオットとジョンはどちらも、あなたが進むことができる非常に異なる方向について良いアイデアを提示しましたが、どちらも正しい方向に進むべきだという点で正しいです. オブジェクト指向設計は、さまざまな種類の動作の分岐をより暗黙的にすることで、コードをより読みやすくするためにあります。見ているオブジェクトの種類を調べて、それに基づいて何をすべきかを判断すると、オブジェクト指向設計を使用する目的が無効になる可能性があります。

また、インターフェイスは厳密には空のクラスではないことも警告しておきます。抽象メソッドとインターフェースを持つ空の抽象クラスの間には、いくつかの大きな違いがあります。インターフェイスを空のクラスと考えるのではなく、インターフェイスをコントラクトと考えてください。インターフェイスを実装することにより、クラスはインターフェイスにリストされている各メソッドを提供することを約束します。

于 2009-04-09T22:57:47.753 に答える