IEnumerableインターフェイス
-
10-07-2019 - |
質問
IList
が IEnumerable
を実装する理由がわかりません。 IList
が ICollection
を実装する ICollection
code> IEnumerable も。
解決
最初のコードが2番目のコードを意味する場合、 ICollection
と IEnumerable
を実装することを宣言する理由を知りたいと思います。主な理由は明快さだと思われます。つまり、人々が IEnumerable
を既に拡張していることを確認するために ICollection
を振り返る必要がないということです。
以前にベースクラスで明示的に実装されていたインターフェイスメソッドを再実装する場合は、インターフェイス実装を再宣言する必要がある場合もありますが、この場合の理由はないと思います。
編集:ドキュメントの作成元のソースコードには、両方のインターフェイスを含む宣言があると想定していました。別の可能な代替方法は、階層内の all インターフェースがdocジェネレーターによって自動的にプルされることです。その場合、質問は「なぜドキュメントジェネレーターがそれを行うのか」になります。 -そして、答えはほぼ間違いなく「明瞭」です。
他のヒント
IList
は、関連付けによって IEnumerable
のみを実装します。つまり、 IEnumerable
を正確に実装するため、 IEnumerable
である ICollection
を継承します。型階層でも同様になります(ただし、単一継承のみ:
class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}
so List
は Enumerable
です;同様に、 IList
は IEnumerable
です。
たとえば、次のように書いた場合:
interface IA {}
interface IB : IA { }
interface IC : IB { }
メタデータを見ると、 IC:IA、IB
のように見えますが、これは間接的なものです。 ILは次のとおりです。
.class private interface abstract auto ansi IA
{
}
.class private interface abstract auto ansi IB
implements IA
{
}
.class private interface abstract auto ansi IC
implements IB, IA
{
}
ReSharperでコードを開く場合、 IList
での IEnumerable
インターフェイス宣言は、で既に指定されているため、必要ありませんでした。 > ICollection
。