2017-11-16 25 views
2

ここでは、「IComparableインターフェイスの実装」というトピックについて、以下のコードを簡単に紹介しています。IComparableインターフェイスの実装

私はいくつかのことを得ることはありません:

  1. IComparable.CompareToが明示的にそこに実装されているのはなぜ?あなたはい、暗黙のうちにIComparableを実装することができます。しかし、基本的に、あなたがやってみたいことがCompareToのちょうど別の暗黙のオーバーロード(1暗黙の int CompareTo (Note other)、別の暗黙のint CompareTo (object other)
public struct Note : IComparable<Note>, IEquatable<Note>, IComparable 
{ 
    int _semitonesFromA; 
    public int SemitonesFromA { get { return _semitonesFromA; } } 

    public Note (int semitonesFromA) 
    { 
    _semitonesFromA = semitonesFromA; 
    } 

    public int CompareTo (Note other) // Generic IComparable<T> 
    { 
    if (Equals (other)) return 0; // Fail-safe check 
    return _semitonesFromA.CompareTo (other._semitonesFromA); 
    } 

    int IComparable.CompareTo (object other) // Nongeneric IComparable 
    { 
    if (!(other is Note)) 
    throw new InvalidOperationException ("CompareTo: Not a note"); 
    return CompareTo ((Note) other); 
    } 

    public static bool operator < (Note n1, Note n2) 
    => n1.CompareTo (n2) < 0; 

    public static bool operator > (Note n1, Note n2) 
    => n1.CompareTo (n2) > 0; 

    public bool Equals (Note other) // for IEquatable<Note> 
    => _semitonesFromA == other._semitonesFromA; 

    public override bool Equals (object other) 
    { 
    if (!(other is Note)) return false; 
    return Equals ((Note) other); 
    } 

    public override int GetHashCode() => _semitonesFromA.GetHashCode(); 
    public static bool operator == (Note n1, Note n2) => n1.Equals (n2); 
    public static bool operator != (Note n1, Note n2) => !(n1 == n2); 
} 

答えて

6

だろうと何

  • Noteと別のものとの比較を避けるためにNoteです。IComparableの場合、従来の使用法があるかもしれませんが、Noteクラスについて直接知っていれば、 llow:

    Note note = new Note(); 
    Other other = new Other(); 
    int result = note.CompareTo(other); 
    

    これは常に例外をスローすることになるので、なぜそれを許可するのですか?基本的に非汎用的なIComparableのインターフェースを「いくらかレガシー」と考えてください(有効な用途がありますが...)。明示的に実装することによって誰もそれを使用しないようにしてください。

  • 関連する問題