これまで､ カプセル化､ 抽象化について説明してきました｡
OPの3本目の柱はどうでしょうか｡
それは継承ということです｡
そして､ 継承によって､ 新しいオブジェクトは既存のオブジェクトのプロパティを引き継ぐことができます｡
だから､ クラスを継承することができるのです｡
例を見てみましょう｡
今までのコードを削除して､ ゲームの例に戻りましょう｡
新しいゲームを作りたいので､ さまざまなタイプのユーザーがいます｡
ウィザード､ エルフ､ アーチャーのようなサブユーザーには､
共通の機能がありますが､ 攻撃方法も異なります｡
だから､ OPを使えば実際に継承ができるのです｡
例えば､ ここにクラスのユーザーがいて､ このユーザーには､ 例えばサインイン機能があるとします｡
また､ サインインメソッドでは､ もう一度selfを受け取り､ とりあえずここに何らかのサインインがあると仮定します｡
ということで､ とりあえずプリントブログということにしておきます｡
そして､ ゲームをプレイするためには､ ログインしていなければならないからです｡
さて､ ほほう､ ほほう､ ここでinitメソッドはどこにあるのだろうと思われるかもしれません｡
最初に実行されるinitメソッドを用意すべきではないでしょうか？
しかし､ ユーザーに割り当てる変数や属性がない場合は､ Aメソッドは必要ありません｡
ということで､ とりあえず､ このサインインメソッド以外にユーザーが持っているものは必要ない､ ということにしておきます｡
さて､ クラスウィザードを作るために､ たくさんのサブクラスを作りたいとします｡
そして､ とりあえず､ ここでパスをして､ 空のクラスを作らないようにしますが､ それでもビルドできるようにします｡
そして､ クラスもあるとします｡
同じく通過するアーチャー｡
ああ｡
ここにブラケットがあることを確認してください｡
さて､ ここからが本題です｡
理想は､ これらウィザードやアーチャーもすべてユーザーであることです｡
そうですね｡
だから､ ユーザーがいるんです｡
そして､ これらのユーザーは複数のフォームを持つことができます｡
彼らは魔法使いになれるのです｡
アーチャーになることもある｡
鬼になることもある｡
ゲームに登場する全キャラクター
しかし､ その全員が､ 仮に最初にサインインしなければならない｡
これらのユーザーやクラスもすべてサインインできるようにするには､ どうすればよいでしょうか｡
まあ､ 継承を使えばいいんですけどね｡
また､ 相続はどのように行うのでしょうか｡
実は､ とても簡単なことなんです｡
やるのはブラケットの中だけ｡
継承したい親クラスを渡します｡
では､ 私がここでユーザーをやるとしましょう｡
では､ ここで実行をクリックしてみましょう｡
放送はありません｡
すべて順調です｡
ところで､ この緑色の線は､ インデントが4の倍数でないことを示しています｡
だから､ こうすればいいんです｡
でも､ 読みやすいように小さくしているのがいいんです｡
なるほど｡
では､ ここでクラスをインスタンス化してみましょう｡
ウィザードのものを作ってから言う｡
ウィザードで､ そのウィザードクラスを実行します｡
さて､ ここで印刷を行うとして､ 例えばプリントウィザードとします｡
実行」をクリックすると
ウィザードオブジェクトが作成されたことが確認できます｡
また､ サインインしていない場合はどうなりますか？
なるほど､ そうなんですね｡
ええ､ 実際にあるんですよ｡
サインインして「実行」をクリックすると
おい､ ログインしてるぞ｡
なんてかっこいいんでしょう｡
この機能はユーザークラスから継承しました｡
そして､ これは本当に､ 本当に強力なことです｡
そうですね｡
そこで､ このウィザードにinitがあるとします｡
方法です｡
ウィザードの作成時に実行されます｡
そして､ 私たちは
名前
そして､ 手に入れるパワー｡
そして､ ここでは､ 自己の名前を等しい名前に割り当て､ さらに自己のドットパワーを等しいパワーに割り当てます｡
そして､ もうひとつのメソッドも追加してみましょう｡
攻撃と称して｡
そして､ この攻撃方法は､ 単純にFの文字列を表示します｡
で攻撃する｡
の力を発揮します｡
セルフパワーとでも言いましょうか｡
そして､ アーチャーにも同じことをするつもりです｡
そこで､ このコードをコピーします｡
ここに貼り付けてください｡
そして､ 射手は名前を持つことになる｡
そして､ パワーの代わりに､ 持っている､ と言ってみましょう｡
矢印の数
そして､ 矢の数｡
新しい属性を手に入れることになる｡
そして､ 攻撃は､ 矢で攻撃することがよくあります｡
そして､ 矢を残す｡
左の矢は矢の本数だけで､ 攻撃するたびに矢が減っていくような楽しいことができます｡
なるほど｡
では､ これをもう少し小さくして見てみましょう｡
これでよしとする｡
さて､ これで最初のウィザードをインスタンス化しましょう｡
とともに｡
仮にマーリンで､ パワーが50とする｡
そして､ アーチャー｡
インスタンス化される
ロビンのように､ 例えば500本の矢を持つとか､ 100本の矢を持つとか｡
それで､ 今度は魔法使いと弓使いの2人が
まあ､ サインインはしてくれるでしょう｡
しかし､ 彼らは攻撃もしますが､ 個々にユニークです｡
クラスです｡
そして､ それぞれ異なる特性を持つことになります｡
見てみよう｡
ウィザードドットをやるとしたら｡
さん ウィザード
1ドット｡
今度は､ こう言おう｡
攻撃する｡
そして､ ちょっと後ろを向かせてください｡
私のコード・インテリジェンス｡
いくつかのエラーがあることを確認します｡
これです｡
何を言っているんだ｡
これは､ 括弧の中に self を忘れてしまったためで､ 最初のパラメータは常に self を与える必要があることを思い出してください｡
下にスクロールして「Wizard Dot」に移動すると､ 名前､ パワー､ 攻撃が表示されます｡
ここで攻撃をクリックすれば､ 私は走ります｡
パワー50で攻撃しているのをご覧ください｡
そうすると､ アーチャー1点攻撃｡
その場合は､ 矢で攻撃してもらうことになります｡
矢印は100を残した｡
しかし､ どちらもサインイン機能を同時に持っています｡
なんてかっこいいんでしょう｡
これが「継承の力」です｡
コードを濡らさないようにしているんですよね？
両者が共有する部分を抽象化し､ それぞれの必要性に応じて変えていくのです｡
ですから､ 例えば､ WizardにArcherとは異なるメソッドやプロパティを持たせ､ かつ､ Wizardが持っているユーザー機能を共有させることができます｡
そして､ こうすることでコードが整理され､ きれいに保たれるのです｡
では､ ズームインを戻して､ はっきり見えるようにしましょう｡
さて､ この継承という考え方は､ 本当に､ 本当に強力です｡
そして､ ここで重要なのは､ 親クラスと子クラスがあることです｡
さて､ これらの子クラスは､ userのサブクラスであったり､ userクラスから派生したクラスであるため､ サブクラスまたは派生クラスと呼ばれることがあります｡
次のビデオでは､ このテーマをもう少し掘り下げてみましょう｡