Универсальные возвращаемые типы из абстрактных / виртуальных методов - PullRequest
3 голосов
/ 25 августа 2009

У меня есть связь между двумя базовыми классами:

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 Указание типа возврата абстрактного метода из базового класса в соответствии с подклассом

Я могу использовать мою конкретную реализацию для возвращаемого типа моего переопределенного метода GetCandidates, но это не то, чего я хочу, я хочу использовать конкретную реализацию другого абстрактного класса. Это родительская / дочерняя база данных. Возможно ли то, что я пытаюсь достичь? В настоящее время я получаю ошибку времени компиляции, что мой тип возвращаемого значения GetCandidates не совпадает.

Спасибо

1 Ответ

2 голосов
/ 25 августа 2009

Похоже, вам нужно определить несколько универсальных типов, причем один из них может быть ограничен для получения из 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
            };
  }
}

Редактировать Включено исправление Криса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...