Effective C# 3rd 読書メモ 26 ジェネリックインターフェイスに加えてクラスインターフェイスを実装する

ジェネリックなインターフェイスだけでなく、古典的な非ジェネリックのインターフェイスもサポートすることで、クラスはより便利になる。

たとえば、クラスにオブジェクト間の比較機能をもたせたい場合、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);
    }
}

コメントを残す

コメントを残す