我创建了两个抽象类:BaseSet
和BaseItem
,它们是ConcreteSet
的父级
public class BaseItem { }
public class ConcreteItem { } : BaseItem
public class BaseSet<T> where T : BaseItem { }
public class ConcreteSet : BaseSet<ConcreteItem> { }
现在我创建了一个动态类型为BaseSet<BaseItem>
public abstract class BaseSetManager<T> : PersistentSingleton<BaseSetManager<T>>
where T : BaseSet<BaseItem>
接下来,当我尝试使用以下命令派生此经理时:
public sealed class ConcreteSetManager : BaseSetManager<ConcreteSet>
我得到了错误The type 'ConcreteSet' must be convertible to 'BaseSet<BaseItem>' in order to use it as parameter 'T' in generic class 'BaseSetManager'
有没有办法像这样保持抽象,或者我不得不放弃抽象并回到基本的一般类型。
我使用的Unity3D不支持协方差(C#3.0)
答案 0 :(得分:2)
由于我仅限于C#3,现在唯一的方法是在BaseSetManager中使用多个类型。更好的想法仍然受到赞赏。
public abstract class BaseSetManager<T, P> : PersistentSingleton<BaseSetManager<T, P>>
where T : BaseSet<P>
where P : BaseItem
public sealed class ConcreteSetManager : BaseSetManager<ConcreteSet, ConcreteItem>
如果您正在寻找具有更高语言目标的答案,请从@AsadSaeeduddin找到有问题的评论