Джастин, это не странно ... это действительно то, для чего предназначено наследование. Ваш класс CandidateBase обеспечивает основу для ваших классов Candidate, и поскольку он является абстрактным, это означает, что он предоставляет некоторую логику, о которой вам не придется беспокоиться в дальнейшем. Я думаю, что это лучше объяснить на примере.
Допустим, у вас есть 2 разных класса-кандидата, и они оба хотят предоставить некоторую функциональность, скажем, GetResume () .. вы можете создать абстрактный класс или интерфейс для этого ... в вашем случае вы создали абстрактный класс как таковой
public class CandidateBase
{
//some logic that you might need to share between Candidates
//such as storing Name, Age..etc
// your abstract method
public abstract String GetResume();
}
теперь допустим, что CandidateA получает свое резюме от определенной веб-службы
public class CandidateA : CandidateBase
{
public String GetResume()
{
//some logic to get Resume from some web service
return resumeStr;
}
}
теперь допустим, что у вас есть CandidateB и вы храните его резюме где-то на диске.
public class CandidateB : CandidateBase
{
public String GetResume()
{
//some logic to get Resume from disk
return resumeStr;
}
}
В какой-то момент ваш код, когда вы вызываете GetCandidates (), вам не нужно беспокоиться о том, какого типа ваш кандидат, вы все равно можете получить его резюме, вызвав GetResume () в CandidateBase.
кстати, Джастин, если это действительно беспокоит вас, вы всегда можете вернуться к CandidateA после вызова GetCandidates ()
IQueryable<CandidateA> candidates = recruiterClass.GetCandidates().Cast<CandidateA>();
РЕДАКТИРОВАТЬ ДОБАВИТЬ
Джастин Я думаю, что это должно исправить вашу проблему, дайте мне знать.
public abstract class CandidateBase
{
public int CandidateId { get; set; }
public string LastName { get; set;}
public string FirstName { get; set;}
public string RecruiterId { get; set; }
//the rest of your logic
}
public class RecruiterBase
{
// Constructors declared here
// ----HERE IS WHERE I AM BREAKING DOWN----
public IQueryable<T> GetCandidates<T>() where T:CandidateBase, new()
{
DataClasses1DataContext db = new DataClasses1DataContext();
return (from candidates in db.Candidates
where candidates.RecruiterId == this.RecruiterId
select new T()
{
CandidateId = candidates.CandidateId,
LastName = candidates.LastName,
FirstName = candidates.FirstName,
RecruiterId = candidates.RecruiterId
}
)
}
}
вы можете использовать это так
IQueryable<CandidateA> candidates = recruiterClass.GetCandidates<CandidateA>();
Я думаю, что это гораздо более чистое решение, чем все эти броски:)