문제

내가 노력해 랩까지 두루 비트에 추상적인 방법을 반환 공분산형,이미 게시 비슷한 질문에 나는 영원히 감사하는 커뮤니티에 대한 정보 제공,나는 그저 필요한 하나의 마지막 밀어를 얻습니다.여기에 내가 무엇을 하려고: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> 그 다음 당신은 무엇을 얻을 것이다.나는 보지 않는 문제가 이 때문에 나중에 당신은 여전히 던지기에 다시 CandidateACandidateB

그래서 정확히 무엇을 달성하려는?어쩌면 나는지 이해 당신은 질문입니다.

편집을 추가합니다:

저스틴,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();
        }
    }

다른 팁

나는 당신의 의도가 좋다고 생각하지만, 순 결과는 당신이 다형성 코드의 요점을 놓치고 가치를 잃는다는 것입니다.

추상 유형 또는 인터페이스로 객체로 작업하는 목적은 어느 알 필요없이 구체적인 구현 어느 구체적인 구현 세부 사항. 나는 당신의 믿음은 콘크리트 유형을 반환함으로써 당신이 추상화를 다루어 추상적 인 기본 클래스의 가치를 부정하기 시작했을 때 고품질 코드를 생성한다고 생각합니다.

적절하게 제작 된 파생 클래스 세트는 콘크리트 유형으로 해결할 필요가 거의 없어야합니다. 추상 클래스는 모든 구현을 수행하기에 충분해야하며 해당 클래스와의 대부분의 작업을 처리해야합니다. 예외는 소수에 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top