与类型T为a的泛型的协方差

时间:2015-08-07 07:30:21

标签: c# .net

我需要一个子类来实现一个返回Type T的方法,其中T符合以下某些条件:

public abstract class NavEntityController<ChildEntity, GenericNavService_T_Entity ...>
  where ChildEntity : NavObservableEntity<GenericNavService_T_Entity>
{
   public abstract T ReadAll<T>(bool forceUpdate = false) where T : NavObservableCollection<ChildEntity>;
   //others
}

我正在尝试在具体类中实现如下:

public class NavJobController : NavEntityController<NavObservableJob, JobCard_Service, JobCard>
    {
       public override NavObservableCollection<NavObservableJob> ReadAll(bool forceUpdate = false)
       {
                //...
       }

}

public class NavObservableJob : ...  {} //Let's just say this is a class or we are going to go down a whole tree of dependencies

但是我得到的错误是我的“子类没有从父级实现继承的抽象成员ReadAll”。

1 个答案:

答案 0 :(得分:2)

抽象类的具体实现需要实现抽象类的抽象成员。

如果你有一个通用的抽象成员,那么你需要一个通用的具体实现。

NavObservableJob比任何NavObservableCollection<ChildEntity>实施更专业,更具体,因为NavObservableCollection<T>不是协变的。

要实现您的目标,您需要将NavObservableCollection<T>定义为接口。这将允许您将接口定义为协变,例如

public interface INavObservableCollection<out T>
{
   // ...
}

注意:使用out Generic Modifier

然后更改NavObservableCollection<T>以便它实现新界面

class NavObservableCollection<T> : INavObservableCollection<T>
{
    // ...
}

然后使用接口作为通用约束,

public abstract class NavEntityController<ChildEntity, GenericNavService_T_Entity>
        where ChildEntity : NavObservableEntity<GenericNavService_T_Entity>
{
    public abstract T ReadAll<T>(bool forceUpdate = false)
            where T : INavObservableCollection<ChildEntity>;

    //others
}