Microsoft の「プログラミング C#」という本に書いてあったことの受け売りですが、インターフェースというのは何かを一言で表していて、自分的に一番分かりやすいと思った部分の抜粋を参考に書いておきます。
"インターフェイスというのは異なるコード間で交わされる契約である、といえます。このため、インターフェイスが定義されており、そして、あるクラスがそのインターフェースを実装していることを宣言していれば、そのクラスのクライアントはインターフェース内部に定義されているすべてのメソッドが確実に実装されていることが保証されます。"
(マーカーインターフェイスというのがあって上記とは違うのですが、それはちょっと置いときます)
C# はクラスの多重継承をサポートしていませんが、インターフェースは可能です。例えば、今回の質問の List<T> 型は以下のように多数のインターフェースを継承しています。
1.なぜインターフェース型の変数などというものが宣言可能なのか
自分の理解では、インターフェースとはあくまでも実装の型宣言のみしかしておらず、具体的な実装が入っていない「もぬけの殻」であり、実運用のためには必ず当該インターフェースを実装したクラスを作る必要がある、と考えていました。
インターフェースは参照型です。それを定義して(または、IList<T> のようにフレームワークで定義済みならば)変数として宣言すれば、それを継承しているクラスのオブジェクト(インスタンス)への参照を格納可能です。
ただし、インターフェースからはオブジェクト(インスタンス)は生成できません。インターフェースを継承したクラスにインターフェイス内に定義されているメソッドを実装して、そのクラスからオブジェクトを生成することになります。
2.インターフェース型変数を用いることのメリットは何か
List<T>型ではなく、あえてIList<T>を使うと、何が良いのか。
使い方によっては「メリット」とは言えないかもしれませんが・・・
例えば上の画像の例で言うと List<T> が継承している ICollection 型の変数に List<T> 型オブジェクトへの参照を代入できます。
逆に、質問で参考にしているコード例では、_list には、例えば質問者さんが IList<T> を継承してカスタムクラスを定義したとすると、そのカスタムクラスのオブジェクト(インスタンス)を作成してそれへの参照を代入することができます。
オブジェクト指向でのカプセル化、継承、多態性・・・とはちょっと違うかもしれませんが、その流れから来ているような気がします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/09 05:29
退会済みユーザー
2020/10/09 06:09
2020/10/10 09:06