문제
내가 노력해 랩까지 두루 비트에 추상적인 방법을 반환 공분산형,이미 게시 비슷한 질문에 나는 영원히 감사하는 커뮤니티에 대한 정보 제공,나는 그저 필요한 하나의 마지막 밀어를 얻습니다.여기에 내가 무엇을 하려고:2 추상 클래스,RecruiterBase 및 CandidateBase,모두가 concreate 구현 RecruiterA 및 CandidateA.RecruiterBase 은 추상적인 방법을 모두 얻을 채용 후보자에 돌려 진행.나의 구현 RecruiterA 무 GetCandidates()메소드를 반환 진행.
public abstract class RecruiterBase
{
// Constructors declared here
public abstract IQueryable<CandidateBase> GetCandidates();
}
public abstract class CandidateBase
{
// Constructors declared here
}
그리고 구현:
public class CandidateA : CandidateBase
{
// Constructors declared here
}
public class RecruiterA : RecruiterBase
{
// 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
};
}
}
하 complile 던지는 컴파일에 오류가 있기 때문에 나의 구현 RecruitreBase 의 GetCandidates()메소드가 반환 IQueryable<CandidateA>
대 IQueryable<CandidateBase
>.
후에 얻을 수없는 제안에 이전 질문에서(일반적인 유형을 반환에서 추상/가상 방법 는)일을 많이 했는데 더 많은 독서,그리고은 다음과 같은 질문에 그래서
를 반환하는 방법 하위에서 재정의하는 방법 서브 클래스에서는 C#?
마지막으로 만든 것을 깨닫게 내가 무엇을 찾고 있었던 방법으로 구현하는 공분산에 대한 내익 유형입니다.내가 사용하는 마크 Gravell 의 조각...
abstract class BaseClass
{
public BaseReturnType PolymorphicMethod()
{ return PolymorphicMethodCore();}
protected abstract BaseReturnType PolymorphicMethodCore();
}
class DerivedClass : BaseClass
{
protected override BaseReturnType PolymorphicMethodCore()
{ return PolymorphicMethod(); }
public new DerivedReturnType PolymorphicMethod()
{ return new DerivedReturnType(); }
}
...에 대한 기준으로 나의 솔루션입니다.그래서 지금 내 RecruiterBase 및 RecruiterA 클래스는 다음과 같다:
public abstract class RecruiterBase
{
// Constructors declared here
public IQueryable<CandidateBase> GetCandidates()
{
return GetCandidatesCore();
}
public abstract IQueryable<CandidateBase> GetCandidatesCore();
}
고 내 구현...
public class RecruiterA : RecruiterBase
{
// Constructors
protected override IQueryable<CandidateBase> GetCandidatesCore()
{
return GetCandidates();
}
public new IQueryable<CandidateA> GetCandidates()
{
return from candidates in db.Candidates
select new CandidateA
{
CandidateId = candidates.CandidateId,
RecruiterId = candidates.RecruiterId
};
}
}
라고 기대했는지 내가 무엇을 찾고 있었지만 나는 컴파일한 시간에 오류가 다음 코드기 때문에 GetCandidates()할 수 없는 암시적으로 변환 CandidateA 을 CandidateBase:
protected override IQueryable<CandidateBase> GetCandidatesCore()
{
return GetCandidates();
}
그래서 나는 추가 주연:
protected override IQueryable<CandidateBase> GetCandidatesCore()
{
return ((IQueryable<CandidateBase>)GetCandidates());
}
모든 것 그때 컴파일하고 하지만 실제로 전화 GetCandidates()내에서 반환 컨트롤러 IQueryable<CandidateBase>
대 IQueryable<CandidateA>
.그래서 내가 다시 시작.
만약 당신이 그것의 모든 방법을 통해 이와 당신을 도울 수 있 나를 보내 12 개의 좋아하는 맥주!
해결책
저도 혼란이 필요한 이유를 통해 이동하는 문제입니다.
는 경우 추상적인 방법이익 유형 IQueryable<CandidateBase>
그 다음 당신은 무엇을 얻을 것이다.나는 보지 않는 문제가 이 때문에 나중에 당신은 여전히 던지기에 다시 CandidateA 나 CandidateB
그래서 정확히 무엇을 달성하려는?어쩌면 나는지 이해 당신은 질문입니다.
편집을 추가합니다:
저스틴,what about this?
public abstract class RecruiterBase<T>
{
// Constructors declared here
public abstract IQueryable<CandidateBase> GetCandidates();
}
public abstract class CandidateBase
{
// Constructors declared here
}
public class CandidateA : CandidateBase
{
}
public class RecruiterA : RecruiterBase<RecruiterA>
{
// Constructors declared here
// ----HERE IS WHERE I AM BREAKING DOWN----
public override IQueryable<CandidateBase> GetCandidates()
{
return db.Candidates.Where(cand => cand.RecruiterId == this.RecruiterId)
.Select(x => new CandidateA
{
CandidateId = c.CandidateId,
CandidateName = c.CandidateName,
RecruiterId = c.RecruiterId
})
.Cast<CandidateBase>()
.AsQueryable();
}
}
다른 팁
나는 당신의 의도가 좋다고 생각하지만, 순 결과는 당신이 다형성 코드의 요점을 놓치고 가치를 잃는다는 것입니다.
추상 유형 또는 인터페이스로 객체로 작업하는 목적은 어느 알 필요없이 구체적인 구현 어느 구체적인 구현 세부 사항. 나는 당신의 믿음은 콘크리트 유형을 반환함으로써 당신이 추상화를 다루어 추상적 인 기본 클래스의 가치를 부정하기 시작했을 때 고품질 코드를 생성한다고 생각합니다.
적절하게 제작 된 파생 클래스 세트는 콘크리트 유형으로 해결할 필요가 거의 없어야합니다. 추상 클래스는 모든 구현을 수행하기에 충분해야하며 해당 클래스와의 대부분의 작업을 처리해야합니다. 예외는 소수에 있어야합니다.