2

私は初心者プログラマー (現在 Java を使用) で、クラス、オブジェクト、および継承/ポリモーフィズムを実践しています。ポリモーフィズムに関しては、何が役立つのかという全体的な考えに混乱しています。Mortal Kombat のような格闘アーケード ゲームの例を挙げましょう。ヘルスの設定、ヘルスの取得、移動などの変数とメソッドを備えたファイターというクラスを作成すると、メインクラスに移動して、次のようなオブジェクトを作成します。次にFighter Scorpion = new Fighter();、同じオブジェクトから他の多くのオブジェクトを作成できます。ファイタークラス。Fighter Cobra = new Fighter();またはFighter Subzero = new Fighter();、別のファイタークラスオブジェクト(ファイターズ)を介してメソッドにアクセスするだけです。

Subzero.setHealth(100);
Subzero.SetShield(200);
Subsero.Move(punch);

Scorpion.SetHealth(200);

...

継承の主題にどのように役立つでしょうか? 私が読んだことから、同じタイプのことを行うために使用されていると思いますが、代わりに、すべてのオブジェクトが同じメソッドを持つのではなく、そのクラスに詳細を設定します。私の例のように、Scorpion クラスに固有の ScorpionAttack メソッドを追加できる、Fighter クラスから派生した新しい Scorpion クラスを作成します。だから、あなたはそのようなことをすることができます...

 Scorpion.setHealth(200); // From the main Fighter class
 Scorpion.ScorpionAttack; // From the specific derived class Scorpion  

継承の全体的な考え方と、それがどのように役立つかを完全に理解しているかどうかはわかりません。私の完全な質問は、継承の考え方について完全に正しいですか、それともポイントを逃していますか?

4

3 に答える 3

1

Mortal Kombat のようなゲームでの画面のグラフィック レンダリングについて考えてみてください。描画する必要のある要素はたくさんあります。スコアボード、ヘルス バー、タイマー、背景、前景、戦闘機などです。あるレベルの抽象化では、各戦闘機も他のインターフェイス要素と同様に「描画可能」であり、描画自体の具体的な方法。

継承は、「IS-A」関係をモデル化する方法であるため、プログラムの一部で使用する一般的な抽象化がますます多くなります。この利点と制約については、リスコフの置換原理を参照してください。

継承は、コードの再利用にも使用できます。メソッド Drawable.drawLine() は、さまざまなクラスで使用できます。

ポリモーフィズムは、メソッドが呼び出される特定のオブジェクトのランタイム クラスに応じて、メソッド呼び出しをさまざまなコード パスに簡単にディスパッチできるようにするオブジェクト指向言語の機能です。それを変換する方法と考えてください。

(pseudocode)
subzero.draw() into subzero.getClass().draw(this=subzero) 
// Figher.draw(this=subzero)
healthbar.draw() into healthbar.getClass().draw(this=healthbar) 
// Healthbar.draw(this=subzero)

継承は、次のようにクラスの階層で実装を追跡します。

(pseudocode)
Fighter.draw(this) into 
if Figher class defines method draw(Drawable this)
     execute function code from Fighter.java
else super(Figher).draw(this)

super(Class) がクラスを取得するところ、継承階層が 1 ステップ上がります。

于 2013-05-17T01:29:04.330 に答える
0

次のように見てください。

現実世界のオブジェクトの観点から考えてください(そのオブジェクト指向:))

Vehicle クラスがあります。

他の 3 つのクラス : Truck、Bus、Car は Vehicle から継承 (いくつかの動作を継承)

ポリモーフィズム (メソッドのオーバーライド) を使用すると、親クラス (ここでは車両) のデフォルトの動作をオーバーライドできます。

したがって、Vehicle で horn() メソッドを呼び出すと (Vehicle を参照変数として使用する場合....)、Car peep peeeep、bus pom pom pmmmm....親メソッドのサブクラスの異なる実装を作成できます。であり、メソッドは実行時のオブジェクト タイプに応じて動的に呼び出されます。

于 2013-05-17T01:42:39.257 に答える