问题
I have a relationship between two base classes:
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
}
And their concrete implementations as such:
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
};
}
}
Per MSDN documentation http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx (about half way down) and a similiar (but not identical) questoin on SO Specifying the return type of an abstract method from a Base Class according to a Sub Class
I can make use of my concreate implementation for the return type of my overridden method GetCandidates but that is not what I want, I want to make use of the concrete implementation of a different abstract class. This is a parent/child database relationship. Is what I am trying to achieve possible? I currently get a compile time error that my GetCandidates return type does not match.
Thanks
回答1:
It looks like you need to define multiple generic types, with one possibly being constrained to derive from CandidateBase.
Try something like this:
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
};
}
}
Edit Included Chris's correction
来源:https://stackoverflow.com/questions/1330473/generic-return-types-from-abstract-virtual-methods