Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免在继承树中进行大量强制转换_C#_Inheritance_Casting - Fatal编程技术网

C# 避免在继承树中进行大量强制转换

C# 避免在继承树中进行大量强制转换,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

   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;}
}