質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

610閲覧

C#の標準インターフェイスについて

tosa123

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/01/28 09:10

編集2022/01/28 09:19

前提・実現したいこと

C#のインターフェイスについて勉強をしていて、インターフェイスが大まかに言うと、配下のメソッドが全て抽象メソッドになっているという様なイメージだというのは分かるのですが、ICollection<T>や、IEnumerable<T>といった標準的に実装されているインターフェイスだといまいちよく分からなくなってしまいます。

例えばですが、List<T>クラスを見ると、

c#

1public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T> 2 { //以下省略 3 }

となっていて、List<T>クラスがIList<T>やICollection<T>といったインターフェイスを実装している事が分かります。

次に試しに、ICollection<T>インターフェイスを確認すると以下のようになっていると思います。

c#

1public interface ICollection<T> : IEnumerable<T>, IEnumerable 2 { 3 int Count { get; } 4 bool IsReadOnly { get; } 5 void Add(T item); 6 void Clear(); 7 bool Contains(T item); 8 void CopyTo(T[] array, int arrayIndex); 9 bool Remove(T item); 10 }

ここでまず1つ質問というか、確認をさせて頂きたいのは、このICollection<T>インターフェイス内で定義されているCountプロパティや、Removeメソッド等のすべてのメンバーは、List<T>クラスに必ず定義するよう強制しているだけという認識で合っていますでしょうか。(つまり、それ以外にはICollection<T>には意味が無いという事で正しいでしょうか。)

しかしここで混乱するのが、上の認識が正しい場合、ドキュメントに書いてあるようなICollection<T>.Remove(T)という様な記述には若干違和感を抱いてしまいます。というのは、ICollection<T>のもつRemove(T)はあくまで、インターフェイスを実装しているクラスにRemoveメソッドの実装を強制させているだけで、ICollection<T>.Remove()そのものの内容は何もないように思えるからです。

ここで改めて質問ですが、ドキュメントに書いてあるようなICollection<T>.Remove(T)において、ICollection<T>の部分は、あくまでICollection<T>インターフェイスを実装しているクラスがあてはまるというのが暗黙の了解的となっているような感じなのでしょうか。もしくは、ICollectionインターフェイスを実装したclassをICollection型に変換した時のためにこうドキュメントに記述しているような感じなのでしょうか。
(すみません、すごい当たり前のような事を聞いているかもしれません。)

また、ICollection<T>.Remove(T)という様に記述できるのは、「明示的なインターフェイス実装」を利用するような感じで(この場合やや意味合いは異なる感じはありますが)、インターフェイスで実装を強制したメソッドには、インターフェイス名.メソッド名という風にアクセスできるからという認識で合っているのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

つまり、それ以外にはICollection<T>には意味が無いという事で正しいでしょうか。

このインターフェースについてはそのとおりです(インターフェースでデフォルト実装を提供することも可能ですが、ここではその機能は使われていません)。

ICollection<T>.Remove()そのものの内容は何もないように思えるからです。

そのとおりで、このインターフェースを実装した具体的な型から実装が供給されます。

投稿2022/01/28 09:22

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/01/28 09:24

> もしくは、ICollectionインターフェイスを実装したclassをICollection型に変換した時のためにこうドキュメントに記述しているような感じなのでしょうか。 ICollectionを実装したあらゆる型を、実際の型は気にせずICollectionとして統一的に扱うことが可能です。「ポリモーフィズム」で調べてみましょう。
tosa123

2022/01/28 09:54

すみません、1つ例を出させて頂きたいのですが、 List<int> list = new List<int>() { 1, 2, 3, 4 }; ICollection<int> collection = list; var count = collection.Count; このコードの最後の行では、ぱっと見先ほど私が言わせて頂いた、一見何も無いようなICollection<T>.Remove()が行われているように思えます。 しかし、これをポリモーフィズムで考えると、list変数の【オブジェクトの型】はあくまでList<int>クラスであり、どの型に代入しようが、あくまで呼び出されるメソッドはこのList<int>クラスを軸に行われるのであって、 それを2行目では、単にICollection<int>型に代入しているだけで、最後の行では、ICollection<T>.Remove()が行われているように見えるが、実際はList<int>.Remove()が行われているという(このインターフェイスを実装したList<int>という具体的な型から実装が供給された)認識で合っているという感じでしょうか。
maisumakun

2022/01/28 09:57

そのとおりです。
tosa123

2022/01/28 10:12

理解できました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問