2009-08-25 26 views
3

私は2つの基本クラス間の関係があります。約半分MSDNドキュメント http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx(パージェネリック戻り値の型

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 
      }; 
    } 
} 

次のような

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 
} 

そして、彼らの具体的な実装をダウン) と同様の(ただし同一ではない)クエストインSO Specifying the return type of an abstract method from a Base Class according to a Sub Class

私はオーバーライドされたメソッドGetCandidatesの戻り値の型に対して私の具現化した実装を利用することができますが、それは私が望むものではありません。別の抽象クラスの具体的な実装を利用したいと思います。これは親子データベースの関係です。私は達成しようとしていることは可能ですか?私は現在、GetCandidatesの戻り値の型が一致しないコンパイル時エラーが発生します。

おかげ

答えて

2

あなたはおそらく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 
      }; 
    } 
} 

編集含まクリスの補正

+0

そして、あなたはそれを私にビート:

はこのような何かを試してみてください。 –

+0

パブリッククラスRecruiterA:RecruiterBase

+0

クラップス、それは私の疑惑でしたが、マネージャー - >候補者、候補者 - >アポイントメントなど、私のデータモデルにはいくつかのエンティティがあります。厳密に型指定されたクラスの具体的な実装を返す場合は、これらのジェネリック型を互いに定義する必要があります。それは膨らんで、扱いにくいようになるかもしれないようです。私は何かが欠けていることを望んでいた。 –