2011-05-11 25 views
5

現在、すべての重要なクラスがインターフェイスを実装するように、コードをリファクタリングしています(単体テスタビリティ用)。私はIComparable(テンプレートなし)を実装するクラスに出くわしました。次のようなものがあります。ジェネリックスがインターフェイスに基づいているインターフェイスを実装する

public MyClass : IComparable 
{ 
    public int CompareTo(object obj) 
    { 
     MyClass cObj = obj as MyClass; 
     if (cObj == null) { throw new ArgumentException(); } 
     // etc. 
    } 
} 

私はそれを使いながらジェネリックを使いたいと思っています。このような何か:

public IMyClass : IComparable<IMyClass> 
{ 
    // Other methods here 
} 

public MyClass : IMyClass 
{ 
    public CompareTo<IMyClass>(IMyClass other) 
    { 
     ... 
    } 
    // Other methods here 
} 

しかし、その後、理想的には、MyClassIComparable<MyClass>(その後、MyClassのサブクラスが実装すべきIComparable<MySubClass>)を実装する必要があります。あなたは、私が説明したアプローチをどう思いますか

このすべて

には、いくつかの質問をするには?このリファクタリングを行うためのより良い方法はありますか? MyClassにも IComparable<MyClass>を実装するという点がありますか?それとも、既に IComparable<IMyClass>を実装しているので意味がありませんか?私が知っていることができるプロのヒントや「ベストな」プラクティスは?

答えて

0

短い回答:それは依存しています。

具体的な例では、仕事を作成するだけなので、不要なインターフェイス(この場合はIMyClass)を作成するのはほとんど常に間違っていると言います。経験則:複数のクラスがそれらを実装している場合にのみインタフェースを使用します。そして、あなたが指摘しているように、この特定のインターフェースは、あなたのクラスを直接比較可能にするという目的を達成することさえできません。

IComparableを実装するクラスは、汎用またはそれ以外の場合は、比較の必要性に応じて異なります。比較が常に基本クラスへの参照の間に行われる場合、派生クラスは決して呼び出されないので、インタフェースを実装する必要はありません。

+0

あなたの経験則に同意しているかどうかわかりません - 私がこれをインターフェイスする理由は、それを使用する単体テストクラスです。それは私がこのクラスを模擬することができることを意味します(間違いなく、あなたが私が単体テストでそれを実装するので、あなたの経験則に同意することを意味します)。 – Smashery

+0

@Smashery:あなたのユースケースはそれほど明確ではありませんでした。これは、「ルールに従う」インターフェイスを完全に有効に使用することです。 :-) –

2

お互いに匹敵する種類のオブジェクトを複数持つことは本当に意味がありますか?言語はこれを可能にしますが、私はそれを使用しなければならなかった回数を0人の手に数えることができます。

IComparableなしでIClassを使用し、派生クラスにIComparableを実装することをおすすめします。

P.S.私はまた、ユニットテスト容易性のためのインターフェースを追加することに反対しています。あなたのプログラムデザインがインターフェイスのみのカップリングを持つファクトリパターンを必要とするならば、すべての手段でそのレベルの複雑さをコードします。ただ、テストを簡単にするためにabuse the designを使わないでください。代わりにMolesを使用してください。

+0

モルズは非常に面白そうです。確かにそれを調べます。ありがとう! – Smashery

+0

+1からカウントすると... ... :) –

関連する問題