抽象/虚拟方法的通用返回类型

时间:2009-08-25 19:37:56

标签: c# override abstraction

我有两个基类之间的关系:

public abstract class RecruiterBase<T>
{
  // Properties declare here
  // Constructors declared here

  public abstract IQueryable<T> GetCandidates();
}

public abstract class CandidateBase<T>
{
  // Properties declare here
  // Constructors declared here
}

他们的具体实施如下:

public class CandidateA : CandidateBase<CandidateA>
{
  // Constructors declared here
}

public class RecruiterA : RecruiterBase<RecruiterA>
{
  // Constructors declared here

  // ----HERE IS WHERE I AM BREAKING DOWN----
  public override IQueryable<CandidateA> GetCandidates()
  {
     return from c in db.Candidates
            where c.RecruiterId == this.RecruiterId
            select new CandidateA
            {
              CandidateId = c.CandidateId,
              CandidateName = c.CandidateName,
              RecruiterId = c.RecruiterId
            };
  }
}

每个MSDN文档 http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx(大约一半) 在SO上有类似的(但不完全相同的)questoin Specifying the return type of an abstract method from a Base Class according to a Sub Class

我可以将我的concreate实现用于我重写的方法GetCandidates的返回类型,但这不是我想要的,我想利用不同抽象类的具体实现。这是父/子数据库关系。我想要达到的目标是什么?我目前得到一个编译时错误,我的GetCandidates返回类型不匹配。

由于

1 个答案:

答案 0 :(得分:2)

看起来您需要定义多个泛型类型,其中一个可能被约束为派生自CandidateBase。

尝试这样的事情:

public abstract class RecruiterBase<T, C> where C : CandidateBase
{
  // Properties declare here
  // Constructors declared here

  public abstract IQueryable<C> GetCandidates();
}

public abstract class CandidateBase<T>
{
  // Properties declare here
  // Constructors declared here
}

public class CandidateA : CandidateBase<CandidateA>
{
  // Constructors declared here
}

public class RecruiterA : RecruiterBase<RecruiterA, CandidateA>
{
  public override IQueryable<CandidateA> GetCandidates()
  {
     return from c in db.Candidates
            where c.RecruiterId == this.RecruiterId
            select new CandidateA
            {
              CandidateId = c.CandidateId,
              CandidateName = c.CandidateName,
              RecruiterId = c.RecruiterId
            };
  }
}

修改包括克里斯的更正