ジェネリックなインターフェイスだけでなく、古典的な非ジェネリックのインターフェイスもサポートすることで、クラスはより便利になる。
たとえば、クラスにオブジェクト間の比較機能をもたせたい場合、IComparable<T>
だけでなくIComparable
も実装する。
public class Name : IComparable<Name>, IComparable
{
public string First { get; set; }
public string Last { get; set; }
public string Middle { get; set; }
public int CompareTo(Name other)
{
if (ReferenceEquals(this, other))
return 0;
if (ReferenceEquals(other, null))
return 1; // nullでないオブジェクト > null
int rVal = Comparer<string>.Default.Compare(Last, other.Last);
if (rVal != 0)
return rVal;
rVal = Comparer<string>.Default.Compare(First, other.First);
if (rVal != 0)
return rVal;
return Comparer<string>.Default.Compare(Middle, other.Middle);
}
int IComparable.CompareTo(object obj)
{
if (obj.GetType() != typeof(Name))
throw new ArgumentException("Argument is not a Name object");
return CompareTo(obj as Name);
}
}