25

最近、私はJavaを調べることにしました。それで、Javaとオブジェクト指向プログラミングのアプローチにまだかなり慣れていないので、もっと学ぶ前にいくつかのことをまっすぐに理解したかったのです(良い習慣から始めるのはすぐにはないと思います) )。

私は今のところ小さな2Dゲームをプログラミングしていますが、私の質問は些細なプロジェクトにも当てはまると思います。簡単にするために、ゲームの例を示します。

私はさまざまな種類のゾンビを持っていますが、それらはすべて同じ属性(x、y、ヘルス、攻撃など)を持っているので、WalkingZombie、RunningZombie TeleportingZombieなどで実装するインターフェースZombieを作成しました。これは最善の方法ですか?抽象クラスの方がいいですか?またはスーパークラスで?(私は関数を部分的に実装する予定はありません-そのため、抽象クラスの代わりにインターフェースを選択します)

主人公(サバイバー)を説明するクラスが1つありますが、かなり大きいので、さまざまな機能を備えたインターフェースを作成して、その構造を簡単に確認して共有できるようにしたいと思いました。それは良い習慣ですか?それとも単にスペースと時間の無駄ですか?

インターフェイス/スーパークラス/抽象クラスの使用は論理的なルールに従い、単なる個人的な選択ではないため、経験豊富なプログラマーはこの種のトピックについて異議を唱えないと思ったので、この質問が主観的なものとして評価されないことを願っています。

4

9 に答える 9

17

インターフェイスは「契約」と考えることができます。このインターフェースを実装するクラスが実装しなければならない一連のメソッドを定義しています。

一方、抽象クラスは、実装するすべての子クラスに共通する可能性のあるコードがある場合に使用されます。したがって、いくつかの一般的なコードを持つShapeという抽象クラスがあり、派生クラス(Circle、Squareなど)に、それらの形状に固有のコードが含まれている可能性があります(getArea例)。ただし、colorのようなものはすべての図形に共通している可能性があるためgetColor、Shape抽象クラスにメソッドを配置できます。

そして、2つのアイデアを組み合わせることができます。インターフェイスを実装する抽象クラスを持つことができ、これにより両方の長所が得られます。

これらの概念はOOで何度も使用されるため、理解することが重要です。あなたは順調に進んでいるようです:)。

したがって、ゾンビクラスにすべてのタイプのゾンビに適用される一般的な動作がある場合は、抽象クラスになるのが適切な候補のように思えます。GameCharacterゲームに他のキャラクターがいる場合は、インターフェイス(おそらくインターフェイス)を作成することも検討できます(多分UndeadMiceまたは何か:))。次に、Zombie抽象クラスとUndeadMouse抽象クラスがインターフェースを実装しGameCharacterます。

于 2010-05-19T20:47:56.893 に答える
4

疑わしい場合は、GOFパラダイムに従うことを選択します。

変化するものをカプセル化します:-独自のクラスで固有の動作を定義します。上記の例を参照するには、別のクラスでウォーキング、ランニング、テレポートの動作を実装します。このようにして、ポリモーフィックな動作が実装されます。

逆に、**一般的なものを集約する**-抽象クラスを使用して、多態的な関連付けの一般的な動作を定義します。オブジェクト間の関係を設計するときに、これらの原則を使用します。

于 2010-05-19T21:44:19.380 に答える
3

はい、抽象クラスを介したインターフェースで正しい方向に進んでいると思います。

あなたが作りたいと思うかもしれない具体的なゾンビは、あなたが実装したいウォーキング、ランニング、またはテレポート機能の任意の組み合わせを所有することができます。

現代のプログラミング理論は、長期的には再利用性と柔軟性を阻害するため、継承を可能な限り阻止すると思います。むしろ、インターフェースと構成を使用して、「密結合」なしで柔軟性を実現します。

継承なしでコードを再利用する1つの方法論では、「継承よりも構成を優先する」パラダイムを適用できます。

Josh Blochの「EffectiveJava」(第2版)は「現在の考え方」と見なすことができると思います...

http://books.google.com/books?id=ZZOiqZQIbRMC&pg=RA1-PA71&lpg=RA1-PA71&dq=%22Bloch%22+%22Effective+java:+programming+language+guide%22+&hl=de&sig=RxlDlRBWUvNAzsAFzqOcftrYI5E#v = onepage&q&f = false

したがって、すべての動作を独立したクラスとして実装し、実装と構成を通じて、各ゾンビの実装に独自の動作の組み合わせを与えることができます。

それが理にかなっていて役立つことを願っています...

于 2010-05-19T21:02:18.097 に答える
1

x、y、healthなどのフィールドの再定義を回避するために、ゾンビを抽象クラスとして記述していました。

Survivorクラスの場合、外部で使用する関数をpublicと宣言するだけです。クラスのトップでパブリック関数を宣言します。実装するクラスが1つしかない場合にインターフェースを宣言すると、保守するファイルが無駄に追加されます。それを避けてください。

于 2010-05-19T20:52:52.830 に答える
1

スーパー/抽象クラスでのインターフェースの使用については誰も同意しません;)

インターフェイスとスーパー/抽象クラスを使用する主な理由は、ポリモーフィズムを有効にすることです。たとえば、あなたの場合、画面上で何かが動いています(プレーヤーやゾンビなど)。同じ方法ですべてを画面上で動かしてみませんか?たぶん、「Movable」などと呼ばれるオブジェクトから画面上を移動するすべてのものを継承します。

そして、あなたが本当にこのようなものに興味があるなら、あなたはミックスインも見たいと思うかもしれません。これはJavaが直接サポートするものではありませんが、Java用に構築されたライブラリがあります。

于 2010-05-19T20:54:53.120 に答える
1

私はさまざまな種類のゾンビを持っていますが、それらはすべて同じ属性(x、y、ヘルス、攻撃など)を持っているので、WalkingZombie、RunningZombie TeleportingZombieなどで実装するインターフェースZombieを作成しました。これは最善の方法ですか?抽象クラスの方がいいですか?またはスーパークラスで?

抽象クラスはゾンビのスーパークラスになります。インターフェイスは、ある意味でゾンビのスーパークラス(スーパーインターフェイス?)にもなります。

共通プロパティは、少なくとも共通プロパティの抽象基本クラスを示唆しています。

(私は関数を部分的に実装する予定はありません-そのため、抽象クラスの代わりにインターフェースを選択しました)

これが何を意味するのかわからない。

さまざまな種類のモンスター(ゴブリン、オークなど)がいる場合、さまざまな基本クラスに属したい、これらに共通の動作が見つかる可能性があります。これはインターフェースを示唆します。

私は抽象的な基本クラスから始めて、あなたがそれを書くときにコードがあなたに何を教えてくれるかを見るでしょう。

主人公(サバイバー)を説明するクラスが1つありますが、かなり大きいので、さまざまな機能を備えたインターフェースを作成して、その構造を簡単に確認して共有できるようにしたいと思いました。それは良い習慣ですか?それとも単にスペースと時間の無駄ですか?

あなたのサバイバーは、いわゆるプレイヤーキャラクターです(ノンプレイヤーキャラクターとは対照的に、通常はサバイバーを攻撃しないゲーム内の誰か)。

ほとんどのゲームは、これらすべてのキャラクタータイプをある種のモンスターとして扱います。これは、すべてのキャラクターに共通の多くのプロパティ(健康、魔法、宝物、武器など)があるためです。

おそらく、それはインターフェースの議論のようなものです。

見る:

継承とポリモーフィズムを使用して一般的なゲームの問題を解決する RPG(ロールプレイングゲーム)のクラス図の例ロールプレイングゲーム の一般的なキャラクターのクラス階層を設計する

于 2010-05-19T23:17:34.383 に答える
0

あなたの場合、あなたのインターフェースとクラス構造は現実とうまく一致しているとは思いません。実際、私は(間違っている場合は訂正してください)、各ゾンビはどこにいるかによって、歩いたり、走ったり、テレポートしたりできると信じています。

したがって、ゾンビクラスまたはインターフェイスがあり、ゾンビの状態を変更するアクションが必要です。アクションはおそらくインターフェースまたは抽象クラスであるため、正確なアクションが何をするかを知らなくても、ゾンビに任意のアクションを適用できます(例action.perform(zobie))。

三本足のゾンビと片腕のゾンビなど、さまざまな種類のゾンビがある場合は、自分自身を表示したり、状態の変化を検証したりするなど、ゾンビのものを処理するさまざまなクラスを実装することをお勧めします(たとえば、特別な種類のゾンビがテレポートを受け入れない)。

于 2010-05-19T20:47:13.487 に答える
0

ゾンビの例では、すべてのゾンビに実行させたい共通のコードがない限り、インターフェイスは適切に機能します。

Moveウォーキングゾンビを歩かせたり、ランニングゾンビを走らせたりするメソッドがあるとします。ただし、「移動」であらゆる種類のゾンビに一般的なことを実行させたい場合は、インターフェースでコードを複製する必要があります。インターフェイスのボディ。

于 2010-05-19T20:50:51.693 に答える
0

私の意見では、Creatureと呼ばれる抽象クラスをすべてのタイプのクリーチャーのスーパークラスとして使用し、それをすべてのタイプのゾンビのゾンビに拡張するがよいと思います。
また、クリーチャーが実行できることを定義するためのインターフェイスも必要になります。
たとえば、歩く、爪を立てる、悲鳴を上げるなど
、抽象クラスが必要な理由は、クリーチャーのインスタンス化を無効にするためです。 、あなたはそれがどんな生き物であるかを知らずに生き物を持ちたくないでしょう?

于 2010-05-20T02:10:47.107 に答える