我可以使用另一个接口实现从接口转换为具体类型

时间:2012-12-05 12:38:47

标签: c# interface

我应该首先说我非常喜欢接口,所以这可能是一个非常愚蠢的问题。如果我的标题不清楚也要道歉 - 与我的想法相符!

我确实理解接口背后的原理,我想在这里使用它们来支持单元测试,并通过DI Framework解耦,这是一个非常混乱和无法测试的遗留代码。

我有一个名为IDatHandler的界面。它有一个List<>称为Items的属性。具体实现应返回具体类型的IDatContainer。当然有一些方法,但我把它们排除在外

public interface IDatHandler
{
    ....

   List<IDatContainer> Items
    {
        get; set;
    }

}

这是一个具体的实现:

public class ADEColorHandler : IDatHandler
    {
      ....

        public List<ADEColor> Items
        {
            get; set;

        }

    }
}

ADEColor实现了IDatContainer。除非我用ADEColor替换IDatContainer,否则具体实现将失败。

有没有办法让项目作为ADEColor类型的列表返回,或者我只是违反规则?

我应该说这个应用目前正在使用NET 3.5

======&GT;&GT;&GT;答案 - 感谢Charleh!

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断言此列表并传递。

1 个答案:

答案 0 :(得分: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());           

然后你可以枚举列表......只是检查一下是否有效。

编辑:nope,因为泛型类型在运行时实际上是不同的,所以没有用。我会乱七八糟 - 我喜欢尝试找出你能做什么,不能用泛型做什么!

编辑:

好的,最好的可能是:

    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。当然,您从具体类型中隐藏,但我假设您在容器上有一个接口来尝试抽象这些实现细节。这应该没问题