‫前回のビデオでは､ 相続について､ その基本を学びました｡
‫しかし､ ここではもう少し深く掘り下げて､ 相続の際に関連するいくつかのキーワードを見てみましょう｡
‫そして､ これから見ていくのは､ virtualとoverrideキーワードです｡
‫さて､ なぜここに動物が映っているのか､ 不思議に思われるかもしれません｡
‫なぜデニスは､ 動物の映像をたくさん見せるのですか？
‫さて､ これから動物クラスを実装し､ それを継承することで､ 動物が親クラスとなり､
‫いくつかのスキルを持っていることになります｡
‫音が出せる､ 食べられる､ 遊べる｡
‫少なくとも動物クラスにはそれを許容するつもりです｡
‫もちろん､ 動物にはもっとたくさんのことができます｡
‫例えば､ 「年齢」という名前を付けて､ お腹が空いたら食べる､ そうでなければ食べないというように､
‫いくつかのプロパティを設定します｡
‫それが本当に動物教室を作るということなんですね｡
‫そして今､ あなたはもちろん､ もうこのクラスを自分で実装していくことができます｡
‫そして､ 同じメソッドや同じプロパティを使うだけでなく､
‫オーバーライドするために､ 継承を使用するのです｡
‫ということで､ 基本的にはこのような実装になります｡
‫そして､ それによって､ virtualやoverrideキーワードなど､ さまざまなキーワードを学んでいきます｡
‫では､ このために新しいプロジェクトを作成しましょう｡
‫コンソールアプリケーションを使ってみる｡
‫バーチャルオーバーライドデモと呼ぶことにします｡
‫わかりました｡
‫もし､ あなたが自分でこれを試したいなら､ ちょっとした挑戦として､ animalと呼ばれる小さなクラスを書き､
‫そのプロパティを持ってください｡
‫ネームエイジは腹をくくる｡
‫もちろんコンストラクタもありますし､ make sounds, eat as well as play というメソッドもありますので､
‫必要であれば積極的に実装してください｡
‫そして､ それらを継承で正しく使えるように､ 少しづつ変化させていく方法を紹介します｡
‫よし､ じゃあ､ 試してみてほしいな｡
‫したがって､ もちろんcontrol k cを使って新しいクラスを作ることができますので､ このクラスをこんな風にanimalと呼ぶことにします｡
‫そして､ この動物クラスは､ 先ほど申し上げたように､ いくつかのプロパティを持つことになります｡
‫nameプロパティ､ Hプロパティ､ is hungryプロパティ､ そして､ これらのプロパティをすべて使用するシンプルなコンストラクタです｡
‫get set を使っているだけなのがわかると思います｡
‫ちなみに､ 本当にすぐにプロパティを作成したい場合は､ プロパティをダブルタップして､ タイプ､ たとえば文字列､
‫そしてここに､ たとえば名前を入力するだけです｡
‫そうすると､ 必要以上に入力する必要がなく､ 非常に早くできるようになるわけです｡
‫わかりました｡
‫つまり､ これがHという名前のコンストラクタになり､ is hungryになります｡
‫そして､ hungryは一度作った動物に設定するものではなく､ デフォルトで最初にtrueに設定するものであることがおわかりいただけると思います｡
‫だから､ 腹をくくってデフォルトに設定しているんです｡
‫なるほど｡
‫そこで今度は､ make soundsという名前のメソッドを用意したいと言いました｡
‫そこで､ この方法について見てみましょう｡
‫そこで､ 空の仮想メソッドを使い､ 他のクラスがオーバーライドできるような音を作っています｡
‫このメソッドを virtual にして､ animal を継承するクラスでオーバーライドできるようにしています｡
‫そして､ 動物が出す音は､ 動物そのものに大きく依存するため､ その方法は後ほどご紹介します｡
‫だから､ お腹が空くということは､ すべての動物が共有していることで､ それが私たちの機能だからです｡
‫私たちはエネルギーを必要とし､ それを食べ物から得ています｡
‫そして､ 食べ物を手に入れる､ あるいは食べ物を食べるというモチベーションを高めるために､ 私たちは飢餓感を持つのです｡
‫しかし､ ここにある仮想メソッド､ これは音を出すのですが､ 空である必要はないのです｡
‫では､ ここでこのイートメソッドを見てみましょう｡
‫そして､ このeatメソッドもバーチャルメソッドになる｡
‫これにより､ サブクラスはこのメソッドをオーバーライドすることができます｡
‫ですから､ もしeatメソッドをオーバーライドしたければ､ そうすることもできますし､ そうする必要もありません｡
‫一般的な機能としては､ ここにあるようなものになります｡
‫だから､ 動物がお腹を空かせているかどうかをチェックする｡
‫もしそうなら､ 名前をプリントアウトして､ 食事中であることを示すだけです｡
‫そして､ お腹が空いていなければ､ name is not hungryと表示されます｡
‫ちなみに名前は､ 私たち動物の所有物なんですね｡
‫この名前､ 動物の財産なんですね｡
‫さて､ これが私たちのメソッドになるわけですが､ 同様に仮想化することにします｡
‫そして､ もう一つの仮想メソッド､ それは再生することです｡
‫この仮想メソッドplayは､ 基本的にコンソールで再生されている名前を表示します｡
‫今､ 私たちは非常にシンプルな赤線のステートメントを使っています｡
‫これはもちろん､ もっと複雑なコードになる可能性もあります｡
‫つまり､ これは全体を単純化して､ いわば人間的に理解しやすくするためのもので､
‫遊んだり食べたりすることは､ 私たちが生活の中で見てきて､ データベースからデータを読み取るなどして､
‫自分でやっているからこそ､ 直接理解できることなのです｡
‫それは､ 普段の生活ではなかなか見られないことです｡
‫なるほど｡
‫わかりました｡
‫では､ animalから派生するクラスを定義してみましょう｡
‫つまり､ これは動物クラスを継承することになります｡
‫では､ コントロールKとC､ またはコマンドKを使って見てみましょう｡
‫そして､ クラスを作成するための画面が表示されます｡
‫そうでなければ､ 犬クラスを作り､ この犬クラスはこのようにanimalを継承することになります｡
‫さて､ 動物名文字列intという必須の形式パラメータ名に対応する引数が与えられていないことは既にお分かりだろう｡
‫そこで､ ここでコンストラクタを作成する必要があります｡
‫では､ 同じ構造を持つ単純なコンストラクタを作成してみましょう｡
‫名前と年齢､ そしてHというベースネームがあり､ その動物を定義したのと同じコンストラクタを使用することができます｡
‫そこで､ Happyまたはis Happyという新しいプロパティを使用することにします｡ これはブール値になります｡
‫これは基本的に､ 動物（この場合は犬）が幸せかどうかだけを記憶するものです｡
‫だから､ 犬が幸せなら真実と言うことになるし､ 犬は幸せな動物である｡
‫だから､ デフォルトでは､ 犬は幸せになれるのです｡
‫では､ このメソッドをオーバーライドしてみましょう｡
‫そこで､ 単純に仮想メソッドであるeatをオーバーライドしてみましょう｡
‫そのため､ このoverrideキーワードを使用しています｡
‫つまり､ 通常のメソッドのようにpublicですが､ このoverrideキーワードを追加しています｡
‫だからオーバーライド､ 無効化する｡
‫こちらこそ､ よろしくお願いします｡
‫また､ このメソッドと同じように､ ここでは仮想キーワードを使用しています｡
‫このvirtualキーワードによって､ サブクラスや継承するクラス､ つまり子クラスはoverrideキーワードを使って基本的に機能をオーバーライドすることができるのです｡
‫もし､ 動物クラスの親クラスの基本機能を呼び出したい場合は､ この場合､ baseを使う必要があります｡
‫baseは､ OK､ baseのメソッドを呼び出すと､ baseは､ よく､ ここにある動物になります｡
‫baseをダブルクリックしてハイライトされると､ animalもハイライトされるのがわかると思います｡
‫コントロールキーを押しながらbaseをクリックすると､ ベースとなるanimalクラスにジャンプします｡
‫ベースクラスへの参照は3つあり､ このベース､ このベース､ そして一番上のこの動物です｡
‫なるほど｡
‫この時点では､ 基本的にベースクラスの機能を使用しており､ 何もオーバーライドしていません｡
‫つまり､ 基本的には犬も他の動物と同じようなものだと言っているわけです｡
‫だから､ ここでは特別なことはしていない｡
‫では､ 音を出す方法を見てみましょう｡ これは､ 犬が正しく音を出す必要があるため､
‫かなり異なるものになります｡
‫そして､ この音の出し方がウケるんです｡
‫また､ ウーフでもいいし､ ウーフでもいいし､ 何でもいいんです｡
‫しかし､ 犬は音を出すのが好きなので､ 私の場合はこうして犬が音を出すことになります｡
‫だから､ これは動物によって違うでしょう｡
‫だから､ 動物によって鳴き声が違うんです｡
‫そのために､ メイク音をオーバーライドしているのです｡
‫さてさて､ この音は､ 私たちがここにいた音です｡
‫私たちは､ それを愛犬のための個別の実装で上書きしているのです｡
‫そして今度は､ 犬は幸せでなければ遊びたくないので､ 同じことを遊びでやってみましょう｡
‫ということにしておきましょう｡
‫ここで､ プレイを見ると､ Dogがプレイしていると書いてありますが､ この結果には納得がいきません｡
‫例えば､ ある犬が幸せな犬でなければ遊べないとしよう｡
‫そこで､ 私たちにできることは､ オーバーライド､ ボイド､ プレイ､ そして犬がハッピーかどうかをチェックし､ その時だけプレイすることです｡
‫つまり､ すでにベースとなる動物の機能を､ 犬用の独自の機能で上書きしてしまっているわけです｡
‫でも､ これって何でもありなんですよね｡
‫自分の体調に制限されることはありません｡
‫これは､ まったく別の種類の実装のようなものかもしれません｡
‫ベースプレイを使う必要もないので､ 何を使っても全く自由です｡
‫例えば､ make soundメソッドでは､ base make soundを使っていないことがわかります｡
‫しかし､ 仮にあったとしても､ ベースコール､ サウンドメイク､ ベースメイク､ プレースプレイをする必要はない｡
‫その気になれば､ ここにまったく別のものを実装することも可能です｡
‫だから､ それが私たちの犬になるのです｡
‫では､ 実際にこの2つのクラスを保存して､ プログラム内のCSSファイルで操作してみましょう｡
‫なるほど｡
‫ここではまず､ 犬のようなものを作って､ 新しい犬と呼ぶことにします｡
‫CIFという名前が付いていて､ 15歳の犬になります｡
‫だから可愛い老犬｡
‫そして今｡
‫このように書けば､ 犬のプロパティにアクセスできるようになります｡
‫だから赤線犬の名前｡
‫そこで､ dog dot nameとdog ageを使って､ 犬の名前と犬の年齢を取得することができます｡
‫そして､ 例えば､ 遊んだり､ 食べたりすることができるのです｡
‫よし､ 早速やってみよう｡
‫ドッグイーターごっこはやめましょう｡
‫では､ これを実行してみましょう｡
‫そして､ シベが15歳であることもわかります｡
‫最も安全な遊び､ 表面の食べ方｡
‫なるほど｡
‫だから､ 遊びも仕事も食べる｡
‫全く問題ありません｡
‫さて､ もちろんDog Dotも使えます｡
‫そして､ ここで音を出す｡
‫そうすると､ これは犬の鳴き声になるんですね｡
‫これを実行しよう｡
‫そして､ 株価を見て､ ウルフと言う｡
‫わかりました｡
‫では､ 前回のビデオで紹介した例とどう違うのか､ 簡単に振り返ってみましょう｡
‫つまり､ ベースクラスがあり､ このベースクラスはいくつかのプロパティと､ いくつかのメソッド､
‫いわば関数を持っています｡
‫だからここで音を出すには､ 例えばE方式とか｡
‫そして､ 継承したクラスで変更・上書きできるようにするために､ virtualキーワードを付加して仮想化します｡
‫つまり､ dogsは継承クラスかサブクラスかということです｡
‫そして､ このサブクラスでは､ overrideキーワードを使ってベース・クラスの特定のメソッドをオーバーライドすることができるようになりました｡
‫だから､ それはこれからです｡
‫機能をオーバーライドする｡
‫つまり､ 現在のメソッドの機能またはコードを置き換えることになります｡
‫もちろんこれをベースに使うのは別ですが｡
‫これは基本的にベースクラス､ つまり親のメソッドを呼び出すだけですが､
‫ここに独自のコードを自由に実装することができます｡
‫ベースクラスを呼び出す必要はありません｡
‫もちろん､ 条件を追加して､ 特定の条件下でベースクラスの機能が呼び出されるようにすることも可能です｡
‫あるいは､ オーバーライドしたメソッドの中に好きなコードを書いても､ 何かが違ってきます｡
‫そしてそれは､ 私たちのコンストラクタにコードを追加していることです｡
‫サブクラスです｡
‫つまり､ この継承するクラスdogは､ 一方でベースクラスが使っているのと同じプロパティを使いながら､
‫同時に独自の実装も持っているのです｡
‫犬が生まれたら､ どうすればいいのでしょうか？
‫では､ 一度ドッグオブジェクトが作られると？
‫そして､ 私たちの場合は､ 犬が幸せになるというだけなのです｡
‫わかりました｡
‫今回の動画は以上です｡
‫もちろん､ 相続については､ まだまだ学ぶべきことが多いので､ これからいろいろと調べていきたいと思います｡
‫それでは､ 次のビデオでお会いしましょう｡