1

インターフェイスを使用する主な理由は、単体テストを簡単にすることです。しかし、インターフェイスの使い方を 100% 理解していないように感じます。

これが私がやろうとしていることの簡略化されたバージョンです:

public interface IPlan
{
    List<Plan> GetPlans(IPlan plan);
    List<Plan> GetAllPlans();
    List<string> DoSomethingElse();
}

public class Plan : IPlan
{
    List<Plan> GetPlans(IPlan plan)
    {
        // 
    List<Plan> planList = plan.GetAllPlans();

    //
    // Do stuff with planList...
    //
}

単体テストをセットアップするには、Plan クラスをモックし、GetAllPlans からプランのセット リストを返せるようにする必要があります。適切にモックできるようにするには、ここでインターフェイスを使用する必要があることがわかります。IPlan オブジェクトを GetPlans に渡し、その IPlan オブジェクトを使用して GetAllPlans を呼び出す必要があることも理解しています (または少なくとも私は考えています)。しかし、この設定では何かが正しくないようです。

これを間違って設定していますか?それが含まれているクラスと同じタイプの IPlan を渡しているのは奇妙に思えます (プランである IPlan を渡します)。これに関するアドバイスはありますか?

4

4 に答える 4

2

あなたの混乱は、あなたの Plan クラスの性質から生じていると思います。おそらくいくつかの計画データをカプセル化するクラスがありますが、それ自体のリストを処理するメソッドも提供します。

もっと多くのコードを見なければ、確かなことはわかりませんが、最初はプランのリストを処理する別のクラスに移動することGetPlansから始めるべきでしょう。GetAllPlans次に、署名が次のように変更されるのは理にかなっています

List<IPlan> GetPlans();
List<IPlan> GetAllPlans();

クラスがジェネリックである可能性がT : IPlanあるため、シグネチャは次のように制約されます。

List<T> GetPlans();
List<T> GetAllPlans();
于 2013-11-12T14:32:32.563 に答える
0

あなたはそれを正しく実装しています。インターフェイスで定義されたすべてのメソッドは、具象クラスに実装する必要があります。

あなたの質問で私が理解できないのは...

「それが入っているクラスと同じタイプの IPlan を渡すのは奇妙に思えます (私は Plan である IPlan を渡します)。」

あなたは明確にすることができますか?

List GetPlans() を意味する場合、このようなことはまったく問題なく、予想されます。計画のコレクションを返す予定です。

インターフェイスは、実装するすべてのクラスが実装する必要があるいくつかのスケルトン メソッドを定義します。これは、クラスがこのインターフェースを実装することを保証する「契約」に基づいています。これはまた、IPlugin インターフェイスがあることがわかっているプラ​​グインのようなことを実行できることを意味し、たとえばリフレクションを使用して、このインターフェイスが実装されているアセンブリをロードし、クラスでメソッドの呼び出しを開始できます。

おそらく、Plan という名前のエンティティ クラスが必要で、IPlan を実装する現在の Plan クラスの名前を PlanOperations などに変更します。このクラスが作業を行っているようで、 Plan は単なるエンティティ/オブジェクトであり、セッターを取得できる可能性があります

于 2013-11-12T14:25:34.617 に答える