C# 避免在继承树中进行大量强制转换
这是一个看起来非常基本的问题,但我仍然找不到办法来解决它。当我有一个简单的继承,比如从a继承的B和CC# 避免在继承树中进行大量强制转换,c#,inheritance,casting,C#,Inheritance,Casting,这是一个看起来非常基本的问题,但我仍然找不到办法来解决它。当我有一个简单的继承,比如从a继承的B和C A | |-----| B C 假设这些接口类似于: public interface A { List<A> Children { get; } } 然后,正如不信者@Damien_所说 public interface ITerm<T> : ITerm where T : ITerm { List<T> Childr
A
|
|-----|
B C
假设这些接口类似于:
public interface A
{
List<A> Children { get; }
}
然后,正如不信者@Damien_所说
public interface ITerm<T> : ITerm where T : ITerm
{
List<T> Children { get; }
}
public interface ITermControl : ITerm<ITermControl> { ... }
public class TermControl : ITermControl { ... }
公共接口ITerm:ITerm其中T:ITerm
{
列出子项{get;}
}
公共接口ITermControl:ITerm{…}
公共类TermControl:ITermControl{…}
我开始认为访问列表ITerm.Children
以及列表ITermControl.Children
是没有用的。这就是我想解释的
谢谢您可以尝试这样做:
public interface A<T> where T: A<T> {
List<T> Children {get;}
}
公共接口A,其中T:A{
列出子项{get;}
}
Eric Lippert在他的文章中描述:
<>这是C++中的一种C变体,我将把它留给我的初学者来解释它在语言中的用法。本质上,C#中的模式是一种强制使用CRTP的尝试
并指出,它实际上并没有在整个过程中强制执行正确的类型,因此,它充其量只是一种文档形式,而不是防止不好的事情发生的东西。类型是否总是与子类型具有相同的类型?您的继承层次结构实际上更深吗?我认为我们需要更多的上下文。我考虑过这一点,但是我们不能真正使用父接口,继承正在失去一点兴趣。@Mr.Pe-好吧,如果您可以从您的问题中删除一些抽象,并展示具体的用例,我们可能会做得更好我们必须与.@Mr.Pe会面,如果您使用接口,这意味着您的基类将是抽象的,不会丢失任何内容。如果你想使用基本属性,你应该使用一个类来代替。“DamiiNeth-Tun-Unistiver,我不能达到你的类型写:”我想你还有其他的手指:)@ MR.PE。你也可以考虑(如果有更多的代码< >代码< < /代码>),把它分成两个接口-<代码> a <代码> >代码> < <代码>,将不依赖于派生类型的成员放置在
A
中。然而,在一天结束时,为了满足您的“不强制转换”要求,子类
方法必须返回编译时已知为派生类型的类型,因此选择正确的T
应该不会有问题。
public interface A<T> where T: A<T> {
List<T> Children {get;}
}