‫このレッスンでは､ 抽象クラスとインターフェースの重要な違いについて学びます｡
‫アプリケーションを設計する際､ 抽象クラスとインターフェースを使い分けること､
‫そしてどちらも使わないことが肝要です｡
‫抽象クラスとインターフェースは似ているように見えますが､ 重要な違いがあり､ どちらが実現しようとすることに最適な選択なのかを決定します｡
‫抽象クラスとインターフェースの違いを理解することは､ 疎結合で拡張可能なアプリケーション､
‫つまり､ すべてを壊すことなく簡単に修正・変更できるアプリケーションを設計するために､ とても重要です｡
‫このビデオでは､ それらの違いと､ どちらを使うべきかの判断方法について説明します｡
‫しかし､ その前に､ まず､ 抽象クラスとインターフェースについて､ 記憶を呼び覚ましておきましょう｡
‫そこでまず､ 抽象クラス｡
‫抽象クラスとは､ 不完全なクラスやインスタンス化できないクラスのことで､ そこからオブジェクトを作ることはできない｡
‫抽象クラスの目的は､ 派生クラスのための青写真を提供し､ 派生クラスが何を実装しなければならないかなどのルールを設定することです｡
‫しかし､ そもそもなぜクラスを抽象クラスと表記する必要があるのでしょうか｡
‫通常授業の何がいけないのか？
‫バイククラスと自動車クラスがあり､ コードの重複を減らすためにいくつかの機能を共有することを想像してください｡
‫vehicleという基本クラスを作り､ vehicle型のインスタンスを作らないようにし､ 各メソッドにそのバージョンのvehicleメソッドを実装するように強制する｡
‫抽象クラスとしてマークする必要があるのです｡
‫抽象クラスを活用してコンポーネントを設計し､ 派生クラスが実装しなければならない共通機能をある程度指定することができる｡
‫そこで､ この車両を抽象化して､ これなら大丈夫だろう｡
‫ここでもう一度､ インターフェースについて見てみましょう｡
‫つまり､ インターフェースはコントラクトであり､ メソッド宣言のみを含むことができるのです｡
‫メソッド定義を含むことはできません｡
‫クラスが持っている能力を定義するものです｡
‫例えば､ 3つのクラスがあるとします｡ クラス､ 自転車､ バイク､ 自動車があります｡
‫そして､ これらのクラスがすべてこのクラスvehicleを継承していることを確認したい｡
‫また､ 例えば自動車に自動運転機能を追加したい場合､ 他のクラス､ 例えば飛行機のようなものを作って欲しい場合､
‫全てのサブクラスがこの機能を持つわけではないので､ ベースクラスの自動車に自動運転機能を追加するのは意味がありません｡
‫I self drivingというインターフェイスの形で追加した方が便利だと思います｡
‫そして､ このインタフェースを実装したこれらのクラスは､ それを実現するためのロジックを提供することができます｡
‫ここで､ インターフェースと抽象クラスの類似点について説明します｡
‫インターフェースも抽象クラスもインスタンス化することができます｡
‫つまり､ これらからオブジェクトを生成することはできないが､ どちらもポリモーフィズムをサポートしており､ 抽象クラスanimal型の変数にcat型のオブジェクトを格納することができる｡
‫同じことは､ リストやスタックのようなコレクションをi列挙可能な型の変数に格納できるインターフェースにも当てはまります｡
‫では次に､ 主な違いを見てみましょう｡
‫抽象クラスは､ そのメソッドを実装またはオーバーライドするサブクラスによって継承されるように設計されています｡
‫つまり､ 抽象クラスは部分的に実装されるか､ 全く実装されないかのどちらかです｡
‫一方､ インターフェースは全く実装されない｡
‫そうすると､ 抽象クラスはその逆のコンストラクタを持つことができないのです｡
‫抽象クラスはメソッド定義だけでなく､ コンストラクタやフィールドを持つことができ､ その実装はインターフェースを実装したクラスが担当することになります｡
‫一方､ 抽象クラスはメソッド､ 定義､ フィールドを持つことができ､ インターフェイスはコンストラクタを持たないので､
‫前述のようにフィールドも持つことはできません｡
‫C-Sharpは単一継承の言語であり､ デフォルトではそれができないので､
‫ある種の多重継承を実現する方法です｡
‫つまり､ 1つのクラスは1つのクラスしか継承することができません｡
‫つまり､ あるクラスがインターフェイスを実装した場合､ そのプロパティやメソッドなどのメンバをすべて実装しなければならないのです｡
‫一方､ あるクラスが抽象クラスを継承する場合､ そのクラスは抽象クラスのメンバのみを実装しなければならない｡
‫つまり､ 抽象クラスの非実装部分｡
‫ここで例え話を見てみましょう｡
‫EUのチュートリアルで､ 抽象クラスのインスタンスを持つことができないので､ 講師があるトピックの専門家であるか､
‫そのトピックの専門家でなければ何も達成できないような鋭い講師を見た場合を想像してください｡
‫だから､ 講師はそのテーマの専門家にならないと教えられない｡
‫そこで､ 講師はシャープの専門家になり､ 今度はCシャープを教えられるようになったのです｡
‫ある時､ Cショップのインストラクターがビデオを編集することになった｡
‫すべてのインストラクターが同じことをする必要はないけれど｡
‫そこで､ これを実現するためにインターフェースIのビデオエディタを実装しました｡ ですから､ すべての講師が編集できる必要はありませんが､ このビデオエディタを実装した講師は､
‫編集ができるようにしなければならないでしょう｡
‫わかりました｡
‫ショップクラスライブラリを設計する際に､ インターフェースよりも継承を選択すべきなのは1つでしょうか？
‫さて､ 抽象クラスは､ そのサブクラスに持たせたい機能がある場合に使用します｡
‫例えば､ 関数のセットがある場合､ サブクラスはそれらを抽象的なクラスに置くようにしたいものです｡
‫抽象クラスは､ 派生クラスがその核となるプロパティと抽象クラスの動作､ つまり実際にクラスを定義するような動作を共有する場合に使用されます｡
‫一般的な契約のみの動作や機能が必要な場合は､ インターフェイスを使用します｡
‫インターフェースは､ 抽象クラスと比較して一般的に緩やかです｡
‫インターフェイスのメソッド全てに同じコードを書き続けるような状況では､ インターフェイスは使いたくないでしょう｡
‫抽象クラスを使用し､ 各メソッドを一度定義する｡
‫というわけで､ 簡単にまとめてみました｡
‫抽象クラスというと､ オブジェクトが何であるかを指定するオブジェクト型の特徴を定義しました｡
‫インターフェースについて話し､ 提供することを約束する機能を定義するとき､ 私たちはオブジェクトができることについての契約を確立することを話しているのです｡
‫では､ その対象は何かというと､ 抽象的なクラスです｡
‫そのオブジェクトにできること
‫インターフェイスのこと｡
‫わかりました｡
‫以上､ 2種類のアプローチの概要についてご紹介しましたが､ いかがでしたでしょうか｡
‫そして､ 次の講義やコース全体を通して､ これらの概念をさまざまな例で使っていきましょう｡