‫このビデオでは､ Cシャープ､ あるいは一般的なプログラミングにおける継承について学びます｡
‫いろいろあって見ているとかなり複雑になってしまうので､ 超シンプルにまとめようと思っているんです｡
‫しかし､ 継承の考え方は､ 本当はコードの再利用性ですから､ できるだけ単純化するつもりです｡
‫そして､ これによって､ 自分たちのコードを減らすだけでなく､ 他の開発者のコードや､ 他のネームスペースのコードも､
‫以前あった多くのコードを何度も何度も手作業で書くことなく､ 直接減らすことができるのです｡
‫そして､ これによって､ 繰り返しのコードや冗長なコードを本当に減らすことができるのです｡
‫継承の考え方は､ 基本的にオブジェクト指向プログラミングの基本概念です｡
‫親クラスの動作を再利用したり､ 継承､ 拡張､ 修正する子クラスを定義することができます｡
‫メンバが継承されるクラスをベースクラスと呼びます｡
‫ベースクラスのメンバを継承するクラスを派生クラスと呼びます｡
‫さて､ ではこれはどういうことでしょうか？
‫簡単に言うと､ 同じコードや機能を持つクラスが複数あって､ それが微妙に異なる場合､
‫実はこの繰り返されるコードや冗長なコードを別のクラスに入れて､ 我々のクラスはそれを継承するようにすればいいのです｡
‫このコードは､ いわばメソッドの機能であったり､ クラスの属性であるプロパティであったりします｡
‫では､ 例を見てみましょう｡
‫そこで､ ここに「Inheritance Demo」と名付けた新しいプロジェクトを作りました｡
‫よし､ ではこの例を見てみよう｡
‫ですから､ 通常､ 複数のクラスを扱う場合は､ ここで新しいクラスを作成します｡
‫だから､ ここでもそうしよう｡
‫もちろん､ 同じファイル内にクラスを作成することもできますが､ それは良い方法ではありません｡
‫では､ このクラスをラジオと呼ぶことにしましょう｡
‫わかりました｡
‫では､ ここで授業､ ラジオ広告を言う｡
‫そして今､ 同じ名前空間にあるこのラジアルクラスがあります｡
‫つまり､ アプリケーションの起点となるmainメソッドがあるプログラムCと､ radialクラスは､
‫どちらも同じファイル内にあるのです｡
‫そこで､ 2つのクラスを用意することにしました｡
‫ひとつはラジオ､ もうひとつはテレビになります｡
‫ここでは､ いくつかのプロパティを想定してみましょう｡
‫例えば､ ラジオの電源が入っているかどうかの状態を判断するブール値や､ ラジオのブランドを判断するブール値などですね｡
‫では､ パナソニックなのか､ それとも他のブランドがあるのでしょうか？
‫そして､ ここには簡単なコンストラクタがあります｡ ですから､ クラスの核となる概念をぜひ理解しておいてください｡
‫もし､ 継承を完全に理解したいのであれば､ 一般的には､ 継承に入る前に､ それを理解することをお勧めします｡
‫なぜなら､ それは互いに積み重なるからです｡
‫なるほど｡
‫基本的にこの機能を使うことになるので､ 2つのメソッドを用意したい｡
‫つまり､ 1つはラジオのスイッチをオンにする方法で､ もう1つはスイッチをオフにする方法となります｡
‫つまり､ この2つの方法でラジオのオン・オフやスイッチのオン・オフができるのです｡
‫そして､ もうひとつは､ ラジオを聴くことができる方法です｡
‫このメソッドはListen Radioと呼ばれ､ チェックされます｡
‫今､ ラジオの電源は入っていますか？
‫つまり､ このブーリアンというプロパティは､ 実際に真になるのでしょうか？
‫もしそれが本当なら､ ラジオを聴くことができます｡ ラジオを聴いていることを示すには､ このコンソールの赤線の文でラジオを聴いているということを示すだけで､
‫それ以外の場合は､ ラジオはオフになっています､ まずスイッチを入れてくださいというエラーメッセージを出力します｡
‫なるほど｡
‫だから､ 聴く前に､ 電源を入れる必要があるのです｡
‫わかりました｡
‫それが今の私たちのラジオなんですね｡
‫さて､ 別のクラスがあると想像してください｡
‫テレビのことです｡
‫では､ さっそく新しいクラスを作成してみましょう｡
‫そこで､ 「add」→「add class」と進み､ このクラスに名前を付けます｡
‫テレビということにしています｡
‫そして､ このクラスでは､ ここと同じようなプロパティをいくつか用意することにします｡
‫だから基本的には､ オンかオフかの状態も持つことにしているんです｡
‫では､ この2つのプロパティをここに追加してみましょう｡
‫そして､ TVの新しいオブジェクトを作成するときに､ これらの値を設定するための簡単なコンストラクタを用意することにします｡
‫ここでは､ 文字列のブランドと同様にpullがオンになっており､ プロパティを設定するわけです｡
‫それから､ 他の方法も個別に用意し､ ラジオの時と同じようにテレビをつけたり消したりできるので､ 基本的にはこのコードをコピーすればいいのです｡
‫ただ､ 今まではラジオというコメントでしたが､ これからはテレビになるので､ 少し違うかもしれません｡
‫つまり､ この方法はテレビの電源を入れ､ この方法はテレビの電源を切ったり､ スイッチを切ったりするものです｡
‫そこで､ テレビを見るための別の方法を用意すればよいのですが､ それはラジオと非常によく似たことをすることになります｡
‫テレビがついているときだけ､ テレビを見ることができるのです｡
‫オフの場合は､ まずテレビをつける必要があります｡
‫さて､ この2つのクラスですが､ 見てみると､ 非常によく似ていますね｡
‫ですから､ このブランドだけでなく､ この物件もオンになっているので､ 基本的には全く同じものがたくさんあります｡
‫両方のクラスで使っているので､ 基本的には冗長なコードになっています｡
‫たくさんのコードをコピー＆ペーストする必要がありましたが､ ほぼ同じです｡
‫では､ どうすれば多くのコードをコピー＆ペーストしたり､ コードを書き換えたり､ 基本的に冗長なコードを持つ必要がなくなるのでしょうか｡
‫まあ､ そこが継承という概念のポイントなんですけどね｡
‫そこで､ 相続が救いの手を差し伸べる｡
‫この問題は､ electrical deviceという第3のクラスを作ることで解決できます｡
‫これには､ 私たちが持っている電気機器に共通する機能・性質がすべて含まれることになります｡
‫では､ それらについて見ていきましょう｡
‫同じものを持っているのは？
‫では､ ラジオだけでなく､ 私たちのテレビにも共通する特性は何でしょうか｡
‫まあ､ 実際には私たちの場合は全部のプロパティなんですが､ 全部でなくてもいいんです｡
‫この場合は､ 物件が増えないからでしょう｡
‫でも､ 同じになるのは2つの物件です｡
‫オンもブランドも､ ラジオだけでなくテレビにも存在する特性なんですね｡
‫新しいクラスには､ この2つのプロパティと､ テレビのオン､ ラジオのオン､
‫ラジオのオフ､ テレビのオフを切り替えるための2つのメソッドが必要です｡
‫ですから､ あなたにとって､ その時点ではプロとプログラミングの関係ではないことが前提ですが､ これをやってみると､ かなり自信がつくと思いますので､
‫ちょっと練習してみてください｡
‫そこで､ これらのプロパティと､ 2つのクラスで共有できるメソッドをすべて持つクラスを作成し､ 別のクラスで作成し､
‫このクラスをelectrical deviceと呼ぶようにします｡
‫実は､ 呼び方は自由なのですが､ ここでは電気機器と呼ぶことにします｡
‫なるほど｡
‫だから､ ビデオをパスして試してみてほしい｡
‫そこで､ 新しいクラスを作り､ 方法を入れます｡ もちろん､ ほら､ ショートカット・コントロール・ケースを使うことができますから､
‫そうしましょう｡
‫この場合､ Control K Cで､ このウィンドウが開きますので､ これをelectricalに変更させてください｡
‫このように工夫する｡
‫そして､ このクラスは､ 他の2つのクラス間で共有しているプロパティを持つことになります｡
‫では､ ここに入れてみますね｡
‫電気機器の状態を決定するブール値で､ 電源が入っているかどうか？
‫そして､ 端末のブランド｡
‫そしてもちろん､ コンストラクタも必要です｡
‫だから､ 電気デバイスはオンになっている｡
‫そしてBrent､ 最後にメソッドと呼ばれる機能性を持っています｡
‫つまり､ 機能があるときはいつでも､ それらをメソッドに入れ､ 機能は何かをオンにしたりオフにしたりすることです｡
‫そのため､ クラスや使用するオブジェクトに何らかのアクションが発生する場合は､ 常にメソッドを使用する必要があります｡
‫そして､ それを実現するのが､ 私たちです｡
‫つまり､ 何か（この場合は電気機器）をオンにしたり､ オフにしたり､ スイッチを入れたり切ったりする方法を使っているのです｡
‫なるほど｡
‫基本的にはそういうことなんですね｡
‫では､ 1つのクラスで共有するプロパティとメソッドを用意したので､ もう1つのクラスであるテレビとラジオのクラスをこのクラスから継承させる､
‫言い換えれば､ このクラスを拡張するようにしましょう｡
‫だから､ ここはあくまで別の言葉として使ってください｡
‫つまり､ 私たちのテレビやラジオは､ 電気機器のクラスを拡張することになるのです｡
‫では､ どうすればいいのか｡
‫まあ､ テレビが終わってしまうので､ ラジオから始めましょう｡
‫ちょっとしたチャレンジ
‫何？
‫自分でやるしかないでしょう｡
‫ここでは､ コロンと継承したいクラスの名前を使っています｡
‫電気機器クラスは､ ラジオが継承するクラスです｡
‫なるほど｡
‫そこで､ Colonと､ 拡張したいクラスの名前を指定します｡
‫そして重要なのは､ もちろん､ このクラスは同じ名前空間にあるか､ またはここに名前空間を追加する必要があるということです｡
‫ですから､ 私たちの場合は､ どれも使わず､ システムだけを使っています｡ しかし､ 同じ名前空間にいるので､
‫電気機器では､ ラジオやテレビと同じ名前空間にクラスがあると言っています｡
‫このようにすればいいのですが､ ここでbooleanが警告を発していることがわかります｡
‫IDにカーソルを合わせると､ Visual StudioがRadio DOTがhides､ inherited member electrical devicesがnewキーワードを使用することを教えてくれるので､
‫hideが意図されている場合は､ これを使用します｡
‫つまり､ 基本的に同じプロパティ名を使用しているわけですが､ このプロパティは電気機器から継承しているため､ いわばすでに持っていることになるので､
‫それを避けたいのです｡
‫もし､ まったく同じ名前のものを使いたいが､ 動作は違うものにしたい場合は､ これを非表示にするか､
‫ここで作成したもので上書きすればよいのです｡
‫もちろん､ それが必ずしも良い方法ではないにしても､ ユースケースに依存します｡
‫これは､ ラジオクラスが､ 隠したり覆ったりする同じ名前のプロパティを2つ含んでいるからです｡
‫ここでは別の言葉になっていますね｡
‫電気機器クラスから継承したプロパティです｡
‫そこで､ もう必要のない冗長なコードを削除することにします｡
‫だから､ それを解消しよう｡
‫そしてもちろん､ 冗長なコードはプロパティの割り当てや作成だけでなく､ これらのメソッドをここに持っていることです｡
‫だから､ それらも排除しよう｡
‫さて､ ここでもう一つエラーが表示されます｡ それは､ このラジオコンストラクタに問題があるようです｡
‫必要な形式パラメータが電気機器､ 電気機器､ プール文字列のonに対応する引数が与えられないと書いてあります｡
‫では､ この電気機器､ 電気デバイスとは何でしょうか？
‫プールのひも まあ､ ここにあるのはこれですね｡
‫それはこのコンストラクタです｡
‫プロパティはベースクラスから取得し､ ベースクラスはコンストラクタを含んでいるので､ ベースクラスを渡すためにbaseキーワードを使用することができます｡
‫コンストラクタ引数なのは､ この2つのプロパティだけで､ 子クラスのコンストラクタは空のボディを持つことになるからです｡
‫ということは､ いろいろな話があるんですね｡
‫しかし､ 基本的にこれが意味するところは､ 私たちのラジオコンストラクタはベースのものよりも複雑ではないので､
‫私たちはただ先に進んでベースと言い､ ここにonとbrandと言うことができるということです｡
‫そうそう｡
‫そうすれば､ ラジオのためのボディは必要ない｡
‫このコンストラクタは､ 基本的にラジオオブジェクトに渡されるブランドプロパティと同様に､
‫is onを渡してくださいと言うでしょうし､ 作成時にそれを電気機器コンストラクタに渡します｡
‫これは､ 基本的に､ 渡された値に基づいて､ ブランドだけでなく､ プロパティを設定するものです｡
‫これがそうなんですね｡
‫もっと複雑なところ｡
‫しかし､ ここでの力は､ 本当に冗長なコードを作る必要がないこと､ そしてまあ､ 私たちのために仕事が行われていることです｡
‫そのため､ コードを書く時間も大幅に短縮されました｡
‫後の例では､ 子クラスのコンストラクタ本体を使用して､ 子クラス独自のプロパティを初期化する方法を紹介します｡
‫ここで簡単にラジオ講座のことを再確認しておきます｡
‫私たちの子供クラスです｡
‫つまり､ 継承するクラスと電気機器が親クラスになるわけです｡
‫つまり､ ベースクラスですね｡
‫だから､ 私たちは継承していくのです｡
‫つまり､ 私たちのラジオは電気デバイスを受け継いでいるのです｡
‫つまり､ 子は親を受け継ぐのです｡
‫基本的には､ 両親のDNAは決まっていて､ 自分も同じDNAを持っているのですが､ いわば､ もう一歩踏み込んだDNAを持っているのです｡
‫そういう考え方もあるんですね｡
‫わかりました｡
‫そこで､ 今度はちょっとしたチャレンジです｡
‫TVクラスもelectrical deviceを継承するように調整します｡
‫だから､ ビデオを一時停止して､ それを試してみてください｡
‫わかりました｡
‫ぜひ試してみてください｡
‫そこでまず､ コロンの電気機器を追加する必要があります｡
‫そうすれば､ 冗長なコードを排除することができます｡
‫つまり､ 繰り返しのコードは､ すでにベース・クラスにあるので､ これはTVクラスのディレクトリでも使えるということです｡
‫そして､ ここでこれを調整し､ データをベースクラスに渡すと言うこともできます｡
‫もちろん､ ここでも設定する必要はない｡
‫しかし､ 後の例で申し上げたように､ やはりいかに効率よく体を使うか､ それが基本になりそうです｡
‫あとは､ プログラムのCSVファイルに移動して､ 実際にコードを確認します｡
‫そして､ 私たちのコードをチェックするということは､ 私たちのラジオのオブジェクトを作成し､ それをテストすることを意味します｡
‫それでは､ ラジオオブジェクトを作成しましょう｡
‫これを私のラジオと呼ぶことにします｡ これは新しいラジオ・オブジェクトになります｡
‫今はもちろん､ オンになっているかどうかパスする必要があります｡
‫だから､ 最初から消して､ ソニー製だからブランドはソニーでと言うことにしているんです｡
‫これで､ プロパティにアクセスできるようになりました｡
‫このツールアイテム､ 私のラジオのプロパティ､ ブランドとis ownプロパティ､ そしてITメソッドにアクセスすることができます｡
‫だから､ スイッチを入れたり､ 切ったり､ ラジオを聴いたりするのです｡
‫また､ 自分たちで作ったことのないメソッドが最初からあることもわかります｡ なぜなら､
‫どのクラスもオブジェクトクラスを継承しており､ オブジェクトクラスには2つの文字列メソッドと､
‫get型のget hashCodeとequalsメソッドがあるからです｡
‫これらのメソッドは､ Cシャープで作成されるすべてのクラスに存在するものです｡
‫つまり､ すべてのクラスはオブジェクトクラスを継承しており､ そのためにさまざまなメソッドが存在するのです｡
‫しかし､ ここでまず､ スイッチを入れてみましょう｡
‫ではここで､ スイッチを入れてください｡
‫これでラジオのスイッチが入り､ ラジオを聴くことができるようになります｡
‫だから､ 私のラジオを聞いてください｡
‫ドット､ 聞け｡
‫ラジオ
‫さて､ これを実行すると､ ラジオを聴くことができるようになります｡
‫ラジオを聴いているように｡
‫そこで､ ラジオオンに切り替えます｡
‫今はラジオのスイッチを入れてラジオを聴くのはやめよう｡
‫そして､ ラジオがオフになっていると表示されます｡
‫まずスイッチを入れる｡
‫では､ 今度はテレビで同じことをやってみましょう｡
‫それでは､ テレビオブジェクトを作成してみましょう｡
‫これをテレビにかけると､ 新しいテレビオブジェクトになり､ こちらも電源が切れます｡
‫しかも､ サムスンの端末になる｡
‫そして今度は､ 私のテレビドットスイッチオンでスイッチを入れてみましょう｡
‫そして､ watch TVメソッドを呼び出すことにしましょう｡
‫マイク
‫では､ これを実行してみましょう｡ テレビがオンになり､ ラジオを聴きながらテレビを見ていることがわかります｡
‫というわけで､ かなり大変な作業です｡
‫しかし､ 基本的に私たちのコードは､ 私たちが望むとおりに動いてくれます｡
‫これで､ ラジオもテレビもスイッチオン方式と呼ぶことがわかりましたね｡
‫テレビクラスを見ても､ このメソッドはないので､ うまくスイッチを入れたり､ 切ったりするメソッドはないのです｡
‫ラジオにもそのようなメソッドはありませんが､ それは､ そのようなメソッドを持つ電気機器からスイッチオン､
‫スイッチオフを受け継いでいるからこそ､ 使えるようになったのです｡
‫だから､ 基本的にここでは､ その方法を使っているのです｡
‫ベースとなるクラスです｡
‫だから､ ここに｡
‫ベースクラスのメソッド｡
‫そして､ ここでは子クラスのメソッドを使用しています｡
‫つまり､ このスイッチオンのメソッドは親クラスから､ TVを見るメソッドは子クラスから提供されているのです｡
‫これで､ ラジオクラスだけでなく､ テレビクラスにも直接､ そのクラス独自の､ いわば繰り返しのないコードを作成することができるようになったわけです｡
‫しかし､ 電気機器全般に共通すること､ これから関係することは､ すべてここで作ることができるものです｡
‫もちろん､ この章を通してそのすべてを調べていくことになります｡
‫それでは､ 次のビデオでお会いしましょう｡