項目26 ジェネリックインターフェイスとともに古いインターフェイスを実装すること
ジェネリックインターフェイスをサポートするクラスを作成するなら、非ジェネリックインターフェイスもサポートする。
ジェネリック以前のコードも多数存在しており、それらの古いコードを使用して新しいコードを作成しなければならないため。
例えば、IEnumerable<T>
はIEnumerable
から派生しいる。ICollection<T>
、IList<T>
はICollection
、IList
から派生していないが、IEnumerable<T>
を継承している。
非ジェネリックインターフェイスのサポート
非ジェネリックインターフェイスをサポートするには、適切なシグネチャを持ったメソッドをクラス内に追加すればよい。
このとき、明示的に実装(int IComparable.CompareTo(object obj)
)すれば、非ジェネリックインターフェイスが意図せず呼ばれることがない。
その他
派生クラスとは比較したくない場合、as
演算子ではなく型のチェックをする。
obj.GetType()==typeof(Name);//objがNameの派生クラスでもfalse obj as Name;//objがNameの派生クラスの場合Name型の参照を返す
> public class Name { } > public class Name2 : Name { } > var nm2 = new Name2(); > var nm2nm = nm2 as Name;//nullにならない > nm2nm.GetType() [Submission#1+Name2]