[英]Can I cast from an interface to a concrete type with another interface implementation
我应该首先说我非常喜欢接口,所以这可能是一个非常愚蠢的问题。 如果我的标题不清楚也要道歉 - 符合我的想法!
我确实理解接口背后的原理,我想在这里使用它们来支持单元测试,并通过DI Framework解耦,这是一个非常混乱和无法测试的遗留代码。
我有一个名为IDatHandler的接口。 它有一个名为Items的List <>属性。 具体实现应返回具体类型的IDatContainer。 当然有一些方法,但我把它们排除在外
public interface IDatHandler
{
....
List<IDatContainer> Items
{
get; set;
}
}
这是一个具体的实现:
public class ADEColorHandler : IDatHandler
{
....
public List<ADEColor> Items
{
get; set;
}
}
}
ADEColor实现了IDatContainer。 除非我替换的具体实施失败ADEColor
与IDatContainer
。
有没有办法让ADEColor
作为ADEColor
类型的列表返回,或者我只是违反规则?
我应该说这个应用程序目前正在使用NET 3.5
========= >>>答案 - 感谢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断言此列表并通过。
你可以走这条路:
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());
然后,您可以枚举并从每个IDatHandler
获取Items
并查询每个IDatContainer
。 当然,您从具体类型中隐藏,但我假设您在容器上有一个接口来尝试抽象这些实现细节。 这应该没问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.