\r\n\r\n

オブジェクト指向のコードを整理するために継承を利用する方法

オブジェクト指向プログラミングを正しく使うということは、継承を理解し、それがいかにコーディングを簡素化し、エラーを減らすか...を理解する必要があります。

オブジェクト指向プログラミングではコードの再利用が一般的で、クラスの存在により、同じ変数や関数を何度も書くことなくオブジェクトを作成することができます。

例えば、木には枝、根、幹があり、これはニレ、カシ、キハダの木に当てはまる。

ゲームにツリーを追加すると、何十本ものツリーセクションを作成することができます。しかし、ツリークラスを作り、他のツリーにそのプロパティを継承させる方が簡単です。

なぜ後継者が重要なのか?

オブジェクト指向プログラミングには「keep it dry」という概念があり、これは「繰り返すな」という意味である。多くのコードをコピー&ペーストしていると、多くのエラーが発生する可能性があります。

例えば、新しいたまごっちのゲームのコードを書いているとします。バーチャルペットの第一弾は、シロクマです。そこで、JavaScript/TypeScriptでPolarBearというクラスを作成する。

class PolarBear { private _weight: number = 990; c***tructor(weight: number = 0) { this._weight = weight } makeNoise() { c***ole.log("made a roar"); } eat() { c***ole.log("eats whatever it wants"); } sleep() { c***ole.log("got a good night's sleep"); } roam() { c***ole.log("wandered about aimlessly"); }}

そんな時、上司から「トップマネジメントに大きなブレークスルーがあった」と言われる。彼らはもう90年代ではないことに気づき、たまごっちに5,000個以上の思い出を詰め込むことができるようになったのです。今、彼らはすべてのクマを欲しがっている。

あなたは腕まくりをして仕事に戻り、クマさんクラスのコピーを作成します。すると、また上司がドアをノックしてくる。より教育的なゲームにしたいのだということがわかりました。あとは、それぞれのペットの出自に関する情報を追加してください。

もはやコードをコピーすることはできません。今度は、8つのベアすべてについて、何百行ものコードを変更しなければなりません。

そうこうしているうちに、また上司がやってくる。今、上層部はすべての齧歯類も巻き込もうとしている。あ、あとキリンも。

そうすると、猿とか欲しがるでしょ。もっといい方法があるはずです。

次世代のタモガッチーを作るのではなく、常に既存のもので遊べるように。

レスキューする相続

継承は、クラスに親と子の関係を追加することで、クラスを整理するのに役立ちます。

ツキノワグマもグリズリーベアもナマケグマもみんなクマ。クマもネズミもサルもみんな動物。こうして家系図を作っていくのです。

コードの一部はこうなっています。

class Animal { private _weight: number; private _origin: string; c***tructor(weight: number = 0, origin: string = "") { this._weight = weight; this._origin = origin; } makeNoise(noise: string = "") { c***ole.log("made a noise that sounded like: " + noise); } eat(food: string = "") { c***ole.log("eats " + food); } sleep() { c***ole.log("got a good night's sleep"); } roam() { c***ole.log("wandered about aimlessly"); }}class Bear extends Animal { c***tructor(weight: number, origin: string) { super(weight, origin); } makeNoise(noise: string = "roar") { super.makeNoise(noise); } eat(food: string = "whatever it wants") { super.eat(food); }}class GrizzlyBear extends Bear { c***tructor(weight: number = 600, origin: string = "North America") { super(weight, origin); }}class Panda extends Bear { c***tructor(weight: number = 230, origin: string = "China") { super(weight, origin); } makeNoise() { super.makeNoise("squeek"); } eat() { super.eat("shoots and leaves"); }}

TypeScriptのサンドボックスでコードを弄ることができます。

これは非常に大きな例ですが、コードは非常にシンプルで、すべてのクラスがAnimalクラスの子孫となっています。クマと動物が見える。GrizzlyBearとPandaは、熊の種類を増やしています。Bearクラスは、デフォルトの音と食べる関数を作成し、GrizzlyBearクラスはこれらのデフォルト関数を使用しますが、Pandaはそうしません。

つまり、GrizzlyBearクラスはBearの関数をオーバーライドしない。GrizzlyBearはBearを継承しているので、Bearで定義された関数が自動的に使用されます。ただし、パンダはmakeNoiseとeatの関数をオーバーライドしているので、それらの関数を使用することになる。

is-a,has-a "テクニックによる関係性の発見

あるクラスが本当に他のクラスを拡張すべきかどうかを調べるには、それらの間に「is-a」または「has-a」の関係があるかどうかを自問すればよいのです。

  • キツネザルはサルです。
  • カンガルーは有袋類です。
  • しかし、ウサギの足はウサギではない。ウサギの足は1本である。

この例は少し簡単ですが、実際のクラスを扱うときにとても役に立ちます。

実践と理解

学んだことを実践する準備はできていますか?

  • サンドボックスを訪れて、上の例の他の動物クラスを記入してください。
  • モンキークラスを追加します。
  • 猿クラスを継承したProboscisMonkeyクラスを追加します。

継承は、単によく整理されたコードというだけではありません。オブジェクト指向プログラミングの核となる部分である。継承は、オブジェクト間の通信を簡素化するのに役立ちます。ポリモーフィズムなど、より高度なオブジェクト指向設計を可能にする。継承については、TypeScriptのドキュメントで詳しく説明されています。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ