这是我的第一个问题,对不起,
我试图声明一个从同一类的继承创建的对象,但它告诉我不能强制继承该对象
abstract class BaseEntity{...}
abstract class BaseController<T> where T : Model.BaseEntity{...}
class DummyEntity : BaseEntity {...}
class DummyController : BaseController<DummyEntity> {...}
当我想创建一个对象时,它表明它不能隐式转换。
BaseController<BaseEntity> a = new DummyController();
最佳答案
你不能这样做。这与covariance有关。
假设BaseController<T>
具有方法Add(T entity)
。
现在,您创建DummyController
的实例。您可以在此实例上调用Add(CowEntity entity)
,因为DummyController
继承了BaseController<CowEntity>
,因此T
是CowEntity
。
现在,如果您能够将其分配给BaseController<BaseEntity>
,您将突然能够调用Add(BaseEntity entity)
(因为T现在是BaseEntity
,而不是CowEntity
)。
这意味着您可以将ChickenEntity
的实例(与CowEntity
无关,它只是BaseEntity
的另一个派生类)添加到该基本控制器(实际上是BaseController<CowEntity>
的实例)。现在突然BaseController<CowEntity>
的一个实例包含一个ChickenEntity
。您会发现这没有任何意义。
要解决此问题,您需要阅读有关interfaces和covariance (and contravariance)的信息。
希望这可以帮助 :)
关于c# - C#继承模板和等级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57936637/