C# 继承中的循环泛型类型-为什么它可以工作?
考虑以下几点:C# 继承中的循环泛型类型-为什么它可以工作?,c#,generics,inheritance,circular-dependency,C#,Generics,Inheritance,Circular Dependency,考虑以下几点: public class EntityBase<TEntity> { public virtual void DoSomethingWhereINeedToKnowAboutTheEntityType() { } } public class PersonEntity : EntityBase<PersonEntity> { public override void DoSomethingWhereINeedToKnowA
public class EntityBase<TEntity>
{
public virtual void DoSomethingWhereINeedToKnowAboutTheEntityType()
{
}
}
public class PersonEntity : EntityBase<PersonEntity>
{
public override void DoSomethingWhereINeedToKnowAboutTheEntityType()
{
}
}
公共类EntityBase
{
公共虚拟无效DoSomethingWhere需要了解EntityType()
{
}
}
公共类PersonEntity:EntityBase
{
public override void doSomethingWhereinedToknowabouttheEntityType()
{
}
}
我将其添加到代码中并运行了它,它工作正常,但我很惊讶我可以继承一个定义基于继承类的类
当我尝试它时,我期望它要么不会编译,要么一旦实际调用就会失败
您可以使用界面执行类似操作:
public interface IEntityBase<TEntity>
{}
public class PersonEntity : IEntityBase<PersonEntity>
{}
公共接口IEntityBase
{}
公共类人员:IEntityBase
{}
实际上,我已经使用该界面将代码从前者切换到了后者,但我仍然很好奇为什么这样做有效。之所以有效,是因为没有理由不起作用
EntityBase
不继承自PersonEntity
,它只引用类型。基类知道自己的派生类并不存在技术问题。这也是可行的(即使这个具体的例子不是一个好主意):
我很惊讶我可以继承一个定义基于继承类的类
小心-您继承的是一个类,它的定义涉及任意类型
,仅此而已。所有这些都是合法的:
class O : EntityBase<object>
class S : EntityBase<String>
class Q : EntityBase<Q>
如果需要这样的东西,任何可以想象的“编译顺序”都不起作用。一个非常简单的例子是通用接口
IComparable
。通常,您可以这样实现它:
class MyClass : IComparable<MyClass> {/*...*/}
class MyClass:IComparable{/*…*/}
通用模板的这个实现只是说MyClass
对象可以与其他MyClass
对象进行比较。正如你所看到的,心智模型没有问题。我可以很好地理解一个类的概念,这个类的对象可以在它们之间进行比较,而不需要知道关于这个类的任何其他信息
这里的要点是模板参数仅由泛型类或接口使用,但它们根本不需要通过继承来关联
IComparable
不继承自MyClass
。因此没有循环。请注意,当您在对象上实现IComparable和IEquatable时,您总是这样做。@FishBasketGordo。TY用于编辑-混合我的vb和c#!这是最适合我的答案。我一直在使用泛型,我是一个超级粉丝,但我的头脑一片混乱。(今天是星期五!)
class A : EntityBase<B>
class B : EntityBase<A>
class MyClass : IComparable<MyClass> {/*...*/}