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.

有没有办法让 Items 作为类型列表返回,ADEColor还是我只是违反规则?

我应该说这个应用程序当前使用的是 NET 3.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每个。当然,您对具体类型是隐藏的,但我假设您在容器上有一个接口来尝试抽象这些实现细节。这应该没问题IDatHandlerIDatContainer

于 2012-12-05T12:41:03.083 回答