1

私はインターフェースを持った初心者なので、これは本当にばかげた質問かもしれません。また、私のタイトルが不明確な場合はお詫びします-私の心の状態と一致します!

私はインターフェースの背後にある原則を理解しています。ここでは、単体テストをサポートするためと、ひどく乱雑でテスト不可能なレガシーコードでDIフレームワークを介してデカップリングするためにそれらを使用したいと思います。

IDatHandlerというインターフェイスがあります。ItemsというList<>プロパティがあります。具体的な実装は、具体的なタイプのIDatContainerを返す必要があります。もちろんいくつかの方法がありますが、私はそれらを省略しました

public interface IDatHandler
{
    ....

   List<IDatContainer> Items
    {
        get; set;
    }

}

これは具体的な実装です。

public class ADEColorHandler : IDatHandler
    {
      ....

        public List<ADEColor> Items
        {
            get; set;

        }

    }
}

ADEColorはIDatContainerを実装します。に置き換えない限り、具体的な実装は失敗ADEColorIDatContainerます。

アイテムをタイプのリストとして返す方法はありADEColorますか、それともルールに違反しているだけですか?

このアプリは現在NET3.5を使用していると言っておくべきでした

========= >>>答え-チャールに感謝します!

IDatHandlerインターフェース

public interface IDatHandler<T> where T : IDatContainer
{
    ....

   List<IDatContainer> Items
    {
        get; set;
    }

}

具体的なクラス:

public class ADEColorHandler : IDatHandler<ADEColor>
        {
          ....

            public List<ADEColor> Items
            {
                get; set;

            }

        }
    }

私のユニットは、このリストに対してADEColorHandler Assertをテストし、合格します。

4

1 に答える 1

4

あなたはこのルートに行くことができます:

public interface IDatHandler
{
    // Any common interface stuff
}

public interface IDatHandler<T> : IDatHandler
    where T : IDatContainer
{
    // Any generics
    List<T> Items;
}

public class ADEColorHandler : IDatHandler<ADEColor>
{
  ....

    public List<ADEColor> Items
    {
        get; set;

    }

}

これは、もう一方の端でキャストを行う必要があることを意味します。ただし、IDatHandlerインスタンスを渡すだけの場合は、クエリを実行する前にジェネリック型を知っている必要があるためです。Items

何を達成しようとしていますか?それはあなたが何を使うことができるかを決定するのを助けるかもしれません...

または、元のインターフェイス実装でIEnumerableを使用することもできます。設計時にコレクションの具体的なタイプを知る必要がありますか、それともキャストを回避できますか?

編集:上記の制約を追加しました

上記のインターフェースを使用するとある程度は機能するので、これを理解しようとしていますが、これらをループして処理するなどの仮定があります-これが機能するかどうか疑問に思っています(チェックする必要があります)

List<IDatHandler<IDatContainer>> someList = new List<IDatHandler<IDatContainer>>();
someList.Add((IDatHandler<IDatContainer>)new ADEColorHandler());           

次に、リストを列挙できます...これが機能するかどうかを確認するだけです。

編集:いいえ、ジェネリック型は実行時に実際には異なるため、機能しませんでした。私は混乱するでしょう-ジェネリックでできることとできないことを理解しようとするのは楽しいです!

編集:

さて、最高のものはおそらく:

    public interface IDatHandler<T> : IDatHandler
        where T : IDatContainer
    {
        List<T> Items { get; set; }
    }

    public class ADEColorHandler : IDatHandler<IDatContainer>
    {
        public List<IDatContainer> Items
        {
            get;
            set;

        }
    }

つまり、次のことができます。

var items = new List<IDatHandler<IDatContainer>>();
items.Add(new ADEColorHandler());      

次に、それぞれを列挙して取得Itemsし、それぞれIDatHandlerにクエリを実行できますIDatContainer。もちろん、具体的なタイプからは隠されていますが、これらの実装の詳細を抽象化するためのインターフェイスがコンテナにあると思います。これは問題ないはずです

于 2012-12-05T12:41:03.083 に答える