‫ポリモーフィズムの例へようこそ｡
‫このビデオでは､ まず最初にちょっとしたチャレンジをしてもらうという､ いつもと違うアプローチで進めています｡
‫継承をもう少し先に､ あるいはもう少し良く理解できるようなコードを書いてみてください｡
‫そして､ このプログラム全体の一部を構成する､ ポリフォームに入ります｡
‫ですから､ どうぞこちらの課題に従ってコードを書いてみてください｡
‫そこで､ ビデオを一時停止して､ 試してみてください｡
‫わかりました｡
‫ぜひ試してみてください｡
‫そこで､ 新しいクラスed classを作り､ carと呼ぶことにします｡
‫そして､ このクラスはあくまで一般車のクラスになります｡
‫そして､ それはプロパティを含むことができ､ または含むべきである｡
‫そうですね｡
‫先ほど言ったように､ HP Propというプロパティがあって､ それが整数で､ HPが馬力になるはずです｡
‫では､ このクルマの実力はいかほどか｡
‫そして､ もう一つのプロパティは､ 文字列型で､ 色は何色ですか？
‫さて､ 次に必要なのはコンストラクタです｡
‫そこで､ HPとカラーを取り込んだパブリックカーを作成することにします｡
‫そしてここでは､ このドットのHPをHPに､ このドットのカラーをカラーに設定しただけです｡
‫この色はプロパティの色になり､ HPはクラスまたはcarタイプから作成されたオブジェクトのHPになります｡
‫さて､ 次はshow detailsメソッドにしましょう｡
‫そこで､ public void show details.
‫そしてここでは､ コンソールに何かを書き込むだけです｡
‫だからCW､ HPはプラスHPになるんです｡
‫次に色ですが､ これは色のようなものであるべきです｡
‫もちろん､ ここで文字列を操作する別の方法を使うこともできますが､ ここではこのままにしておきます｡
‫とてもシンプルです｡
‫で､ 次はpublic voidでrepairという名前です｡
‫そして､ この2つの方法は後で変更することにしています｡
‫だから心配ない｡
‫でも､ 今はとてもシンプルにしたかったんです｡
‫これまでのアプローチで､ ポリモーフィズムが何をするのか､ ここではただ車が修理されたというだけなのかが､
‫より明確になるはずです｡
‫さて､ これが車とベースクラスです｡
‫そして､ もう2つのクラスが必要です｡ これはBMW､ BMWクラスです｡
‫そしてこの中に､ 先ほど言ったように､ モデルという追加のプロパティがあり､ これは文字列モデルです｡
‫さて､ もうひとつの側面は､ プライベートメンバーであるブランドでした｡
‫プライベートストリングスブランドでBMWということですね｡
‫次にコンストラクタが必要なので､ public BMWを作成します｡
‫そして､ その前に､ コンストラクタを作る前に､ carを継承したいと思います｡
‫だから今､ 私のBMWはcarから受け継ぐことになるのです｡
‫そして､ ここで必要なのは､ HPP､ 次に色とモデル､
‫そしてこことコンマです｡
‫だから､ 私ができることは､ HPPを設定することです｡ 実は､ 先に進んで､ 同じことを色で行うこともできます｡
‫これは色になり､ 私たちのプロパティであるモデルは､ モデルになるはずです｡
‫だから､ これはここ､ あそこ､ このオブジェクトに欲しいからこれを使う､ 同じことはここでもできるし､
‫ここでもできる｡
‫ですから､ この中に作ったものがなくても､ ご覧のように使うことができるのです｡
‫さて､ ここでまだご覧になっていないのが､ ベースとなるものです｡
‫つまり､ ここでbaseキーワードを使えば､ 単純に､ HPPとベースクラスの色を使いたい､ と言うことができ､
‫その2行はもう必要ないので､ それらを取り除くこともできます｡
‫これでお分かりのように､ エラーも消えます｡
‫これで､ 私たちのベース､ つまりベースクラスのコンストラクタを使用するコンストラクタが作成されました｡
‫このコンストラクタを使用して､ モデルを追加するだけです｡
‫これで､ すべての仕事をこなす､ 非常に短いコンストラクタができました｡
‫さて､ 次に必要なのは､ やはりボイドショーの詳細です｡
‫そして､ ここでは詳細を表示したいだけなので､ ここからメソッドをコピーするか､ メソッドのエントリーをコピーします｡
‫そして､ ここではブランドファーストになるのです｡
‫だから､ ブランド＋ブランド＋HP｡
‫だから､ 今は追加の詳細を表示するようにしたんだ｡
‫そして､ ここでは､ ご覧のように､ 詳細を表示､ 非表示､ 継承されたメンバーの車の詳細を表示､ 非表示が意図されている場合は､
‫新しいキーワードを使用します｡
‫それは次のビデオで取り上げることにしています｡
‫しかし､ とりあえず､ repairメソッドも作っておきましょう､ public void repairです｡
‫そして､ この中にBMWとこの中に修理されましたというようなことが書かれていればよいのです｡
‫では､ そこにあるこのゼロは何なのか？
‫まあ､ それがモデルなんですけどね｡
‫そこで､ 車種を知りたいだけなのですが､ 仮にBMW､ Z､ ファイ､ az4やMX3､ MX5が修理されたとしています｡
‫だから､ これはそうすべきなんです｡
‫そして今､ もう一つ､ 別のクラスが必要なのですが､ これはここにあるものとかなり似ています｡
‫そこで､ 新しいクラスを作り､ それをAudiと呼ぶことにします｡
‫簡単のために､ ここにあるものをほとんどコピーします｡ 実は､ クラス全体が非常に似ているからです｡
‫違うのは､ ここではAudiであること､ Audiをコンストラクタとして持っていること､ そしてもちろんcarを継承する必要があることです｡
‫さて､ これで完成したわけですが､ 次はポリモーフィズムの部分です｡
‫アウディも車種ですし､ BMWも車種です｡
‫そして､ この基本クラスはcarであり､ このクラスのオブジェクトを複数作成することができます｡
‫これで､ 現地に行けばすぐに意味がわかる｡
‫では､ carsという新しい変数を作ってみましょう｡
‫そして､ これは車のリストですが､ 車のクラスの､ これらをすべて作ることができ､ BMWはここに入っています｡
‫例えば､ アウディは青色で､ A4サイズです｡
‫それから､ 新しいBMWは､ たとえば250HPで､ 赤い車で､ MX3だとします｡
‫つまり､ ポリモーフィズムの1つの特徴として､ 例えばリストや一般的な作業において､ ベースクラスの代わりにサブクラス､
‫ベースクラスの代わりに派生クラスを使うことができるのです｡
‫これから行うのは､ for eachループを実行し､ carsリストにあるすべての車をチェックすることです｡
‫そして､ 車の修理のようなことを書いたり､ 修理のメソッドを呼び出したりするだけです｡
‫よし､ じゃあ､ それを呼び出すか､ 実行するか｡
‫しかしその前に､ 正しいキーをコンソールする必要があります｡
‫そうでなければ､ 私たちのプログラムは単に閉鎖されてしまうからです｡
‫そうそう､ そうなんです｡
‫車の修理が完了しました｡
‫つまり､ ここでcarメソッドを呼び出しているのです｡
‫こちらはどちらでしょうか？
‫車の修理が完了しました｡
‫だから､ この修理方法を呼んでいるわけでもなく､ BMWが修理されたとか､ ここは実はオーディオやアウディであるべきだとか､
‫そういうことでもない｡
‫Audiを修理しました｡
‫だから今､ なぜそれが私たちの車の修理方法ではなく､ BMWやアウディの1つのものを呼び出すことは､ 2つのことに関係しています｡
‫そのひとつが､ このボイドリペアで､ バーチャルではないのです｡
‫そこで､ バーチャルボイドリペアにすると､ 今できることは､ 例えば､ ここでオーバーライドすることができるようになります｡
‫これで､ repairメソッドをオーバーライドできるようになったわけです｡
‫それがどうなるかというと､ もう一度コードを実行すればいいのです｡
‫見ていきます｡
‫車の修理が完了しました｡
‫それが私たちのアウディ､ 最初の1台です｡
‫そして､ BMW M3が修理され､ それが2台目です｡
‫そして､ このBMWクラスがrepairメソッドをオーバーライドしているためです｡
‫そこで､ このメソッドを単純に仮想化し､ 派生クラスでオーバーライドすることができます｡
‫そして､ それをここで実現したのです｡
‫つまり､ ポリモーフィズムには2つの側面があるのです｡
‫つまり､ ポリモーフィズムのネットワークとODI､ VW､ Porscheなど､ 自動車を想定したさまざまなクラスがすべて使えるのです｡
‫ですから､ このクラスや自動車クラスを継承している場合は､ いつでもこのクラスを代わりに使用することができます｡
‫そして､ ポリモーフィズムの第二の側面は､ 仮想メソッドをベースクラスではなく､ 派生した各クラスで呼び出すことができることです｡
‫それは､ BMWで行ってきたことですが､ 今回､ こちらのオーダーでも同じことができるようになったわけです｡
‫だから､ それもオーバーライドにすればいいんです｡
‫オーバーライド､ ボイド､ リペア
‫では､ もう一度実行してみましょう｡
‫そして今､ どちらも自分のブランドとモデルを見せるべきです｡
‫そこで､ アウディA4とBMW M3が修理されたのを確認しました｡
‫しかし､ ポリモーフィズムにはもう一つある｡
‫そのため､ ベースクラスのメンバーを新しいメンバーで隠したい場合は､ newキーワードを使用します｡
‫では､ carというクラスに､ このvoidのshow detailsメソッドがあるとします｡
‫仮想空洞ではないのです｡
‫そして､ それをオーバーライドしたい場合､ ここでオーバーライドしたような意味でのオーバーライドではなく､ オーバーライドの方を行います｡
‫しかし､ 実はBMWを使うときはいつもこの方法を使いたいのです｡ 古いものをオーバーライドするという意味ではなく､
‫carからのものを隠して､ 代わりにshow detailsを使いたいのです｡
‫新しいキーワードを使えるようになった｡
‫つまり､ このショーの詳細がカーショーの詳細より優先されるということです｡
‫つまり､ 上書きするのではなく､ 再優先するのです｡
‫では､ 次はどのように撮ればいいのか｡
‫Show this show detail method or use this show method?
‫さて､ 200馬力のBMWの新車pmwz3を作ってみましょう｡
‫黒にしよう｡
‫そして､ az3モデルです｡
‫そして､ Audi､ Audi a threeも作りましょう｡
‫例えば100馬力の新型アウディになるんです｡
‫そして､ こちらは緑色｡
‫車としては非常に奇妙な色｡
‫そして､ こちらの3モデルですね｡
‫では､ ここでBMWとshow detailsのメソッドを実行してみましょう｡
‫そして､ アウディも同様です｡
‫アウディ
‫詳細を表示するための3つです｡
‫では､ それを実行してみましょう｡
‫そして､ HP200､ カラーブラックHP100カラーグリーンが見えますね｡
‫つまり､ ご覧の通り､ カーショーの詳細メソッドを呼び出しているのであって､ BMWのものを呼び出しているわけではありません｡
‫そして､ それはクルマとして作ったからこそ､ クルマとしての新しいBMWが生まれるのです｡
‫では､ 今同じことをするとしたら､ BMW MX fiveを作ろう､
‫これは車ではなく､ 今度はB､ M Wの新しいBMWで､ これは､ 例えば330馬力とします｡
‫白くて､ MX5です｡
‫このB M W MX five dot show detailsメソッドを呼び出すと､ ブランド名とHP
‫330の色（白）が表示されます｡
‫そして､ 最初の1枚｡
‫だから､ ここにいる人たち｡
‫また､ 詳細な方法を示す必要がありましたが､ 彼らは車のものを使い､ 今､ BMWのものはBMWのものを使っています｡
‫つまり､ new BMWと言ったとしても､ 内部的にはBMWであるcarオブジェクトを作成するためにcarクラスを使用しますが､
‫carsメソッドを呼び出し､ BMWメソッドを呼び出さないようにしています｡
‫つまり､ このnewは､ 「もし私のオブジェクトを作ったら､ newとして書きなさい」ということを意味しています｡
‫そうでない場合は､ 単純にcarsのメソッド､ またはcarクラスのメソッドをベースクラスとかなり一緒に使ってください｡
‫しかし､ ベースクラスのshow detailsメソッドをBMWオブジェクトに呼び出したい場合はどうすればいいのでしょうか？
‫そうすると､ 次のようなことができるようになります｡
‫先に進み､ 車Bと呼ぶ車を作成します｡ BMWのm5とします｡
‫でも､ そうなりそうなんです｡
‫車です｡
‫ここではキャスティングを使用して､ BMWを車にキャスティングしています｡ そして､ 先に進み､
‫車bドットでBMW MX fiveの詳細を表示できます｡
‫または私の車の私達が再びhpp 330の色の白であるようにすることである｡
‫それが､ このBMW m5です｡
‫では､ なぜ､ この新しいキーワードを会員に隠して使うという方法をとるのでしょうか？
‫派生メンバをベースクラスのメンバと同じ名前にしたいが､
‫仮想呼び出しには参加させたくない場合などに使います｡
‫そこで､ ここに出てきたこの新しいキーワードを使うわけです｡
‫そうでない場合は､ このオーバーライドの方法､ またはメソッドの宣言でこのオーバーライドキーワードを使用するだけです｡
‫わかりました｡
‫つまり､ かなりのもの､ ポリモーフィズムですね｡
‫次のビデオでは､ それを防ぐ方法を確認します｡
‫そのため､ メソッドをオーバーライドすることができないようにする必要があります｡
‫ベースクラスにはその方法があります｡
‫それでは､ 次のビデオでお会いしましょう｡