2009-08-25 7 views
3

Ich habe eine Beziehung zwischen zwei Basisklassen:Generika Rückgabetypen von abstrakten/virtuellen Methoden

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 
} 

Und ihren konkreten Implementierungen als solche:

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-Dokumentation http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx (etwa auf halbem Weg unten) und ein ähnlich (aber nicht identisch) questoin auf SO Specifying the return type of an abstract method from a Base Class according to a Sub Class

Ich kann meine Concreate-Implementierung für den Rückgabetyp meiner überschriebenen Methode GetCandidates verwenden, aber das will ich nicht, ich möchte die konkrete Implementierung einer anderen abstrakten Klasse nutzen. Dies ist eine Eltern/Kind-Datenbankbeziehung. Ist das, was ich erreichen will, möglich? Ich erhalte zur Zeit einen Kompilierzeitfehler, dass mein Rückgabetyp GetCandidates nicht übereinstimmt.

Dank

Antwort

2

Es ist wie Sie mehrere generische Typen definieren müssen aussieht, mit einer möglicherweise von CandidateBase abzuleiten eingeschränkt zu sein.

so etwas wie dieses Versuchen:

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

bearbeiten inklusive Chris Korrektur

+0

Und Sie schlugen mich darauf. –

+0

Wird er nicht brauchen öffentliche Klasse RecruiterA: RecruiterBase

+0

Mist, das war mein Verdacht, aber es gibt mehrere Entitäten in meinem Datenmodell wie Manager-> Kandidat, Kandidat-> Termin, etc ... Also ich Ich werde alle diese generischen Typen untereinander definieren müssen, wenn ich stark typisierte konkrete Implementierungen meiner Klassen zurückgeben möchte. Es scheint, als könnte das schnell und unhandlich werden. Ich hatte gehofft, dass da etwas fehlte. –