2009-08-25 11 views
3

moi avons une relation entre deux classes de base:types de retour génériques de méthodes abstraites/virtuelles

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 
} 

Et leurs réalisations concrètes en tant que tels:

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

par documentation MSDN http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx (environ à mi-chemin vers le bas) et une questoin similaire (mais non identique) sur SO Specifying the return type of an abstract method from a Base Class according to a Sub Class

Je peux utiliser mon implémentation concreate pour le type de retour de ma méthode surchargée GetCandidates mais ce n'est pas ce que je veux, je veux utiliser l'implémentation concrète d'une classe abstraite différente. Ceci est une relation de base de données parent/enfant. Est ce que j'essaye de réaliser possible? J'obtiens actuellement une erreur de temps de compilation que mon type de retour GetCandidates ne correspond pas.

Merci

Répondre

2

Il semble que vous devez définir plusieurs types génériques, avec un pouvant être contraint de tirer de CandidateBase.

Essayez quelque chose comme ceci:

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

Modifier Inclus Correction de Chris

+0

Et vous me devança. –

+0

N'aura-t-il pas besoin d'une recrue de classe publiqueA: RecruiterBase

+0

Crap, c'était ma suspicion mais il y a plusieurs entités dans mon modèle de données telles que manager-> candidat, candidat-> rendez-vous, etc ... Donc je Je vais devoir définir tous ces types génériques entre eux si je veux retourner des implémentations concrètes fortement typées de mes classes. Il semble que cela pourrait devenir bouffi et difficile rapidement. J'espérais qu'il y avait quelque chose qui me manquait. –