2017-12-19 1 views
0

のは、私はこのコードを持っているとしましょう:それは一般的なパラメータとしてインターフェイスをEqualityComparerを呼び出すために意味を成してい

public interface IInterface 
{ 
    // Properties... 
} 

internal class Realisation : IInterface, IEquatable<IInterface> 
{ 
    // Properties... 

    public bool Equals(IInterface other) 
    { 
     // ... 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as IInterface); 
    } 

    public override int GetHashCode() 
    { 
     // ... 
    } 
} 

目的は平等コードの重複/異なるバージョンを持っていないことですが。

Realisationにアクセスできません。コードはライブラリに存在するため、アクセスできません。 IInterfaceの等価比較関数を呼び出す必要がある場合は、ここにEqualityComparer<IInterface>.Defaultと呼ぶのは意味がありますか?実装でEquals(IInterface other)を使用しますか?あるいは、平等の実装がクラス外にあるべきか?カスタムIEqualityComparer<IInterface>を提供する必要がありますか?

編集

  • 追加Equals(object obj)GetHashCode()オーバーライド
+0

正確なセットアップとテストでダミーのクラスライブラリを作成し、見つけてください。これはまっすぐでなければなりません。 – CodingYoshi

答えて

0

私はそれがSingle responsibility principleを満たすよう、あなたが、あなたのクラスの外にあなたの比較子を入れて良いことを示唆 - クラスの複数の事よりも、1つのタスクのみのraherを行います(それはスーパークラスにならないはずです)と(Open Close Principle)Extend your class rather than modifying your classとなります。これは、あなたのクラスで、seprateクラスのrahterで等しいコードを保持することを意味します。 Equals & GetHashcode状のベースオブジェクトクラスのメソッドをオーバーライドし、あなたはむしろIEquatableを利用するよりもクラスコードへのアクセス権を持っている場合


もう一つ(これは私の提案です)。

+0

@David - ありがとうupdatd ..完全に忘れてしまった –

+0

ええ、私は 'Equals'&coオーバーライドについて言及していませんでした。 – gfache

+0

@gfacheが追加されました。それはちょっとした提案ですが、IEquitableインターフェイスの実装を行う場合は、新しいクラスを作成してそこに実装して、イコライズ操作を実行してください –

関連する問題