2009-02-05 4 views
1

J'ai une classe de base qui n'est pas générique avec une classe générique dérivée. AbstractRepository et ILoggingManager sont fournis par le framework IoC.Comment déclarer le constructeur pour une classe générique avec une classe de base non générique avec des paramètres

classe de base

public abstract class EventHandlerBase 
    : AbstractDataProvider 
    , IEventHandler 
{ 
    public EventHandlerBase(
     AbstractRepository data, 
     ILoggingManager loggingManager 
     ) 
     : base(data, loggingManager) 
    { 
    } 
} 

classe dérivée

public abstract class EventHandlerBase<TDetail> 
    : EventHandlerBase 
    where TDetail : Contracts.DeliveryItemEventDetail 
{ 
} 

Je voudrais déclarer un constructeur dans la classe dérivée qui appelle la classe de base non générique, mais je ne pas connaître la syntaxe.

Répondre

4

devrait-il pas être plus comme:

public abstract class EventHandlerBase<TDetail> : EventHandlerBase  
    where TDetail : Contracts.DeliveryItemEventDetail 
{ 
    public EventHandlerBase(AbstractRepository data, ILoggingManager loggingManager) 
    : base(data, loggingManager) 
    { 
    // Initialize generic class 
    } 
} 
+0

J'ai essayé cela, mais le compilateur a donné une erreur. Je viens d'essayer à nouveau et ça marche maintenant. En pensant à ce sujet, je n'ai pas reconstruit le code en soi, je laisse juste le compilateur d'arrière-plan entrer en jeu. Visual Studio essaie de construire au fur et à mesure. Évidemment, cela ne fonctionne pas tout le temps. –

4
public class EventHandlerBase(AbstractRepository data, 
           ILoggingManager loggingManager) 
    : base(data, loggingManager) 
{ 
    // Whatever 
} 

devrait fonctionner correctement. Si ce n'est pas le cas, pourriez-vous montrer les problèmes que vous rencontrez?

EDIT: Je pense que toute la question de la classe de base peut obscurcir le problème ici. Lorsque vous déclarez un constructeur dans un type générique, vous ne spécifiez pas les paramètres de type. Par exemple, List<T> ressemblerait à quelque chose comme:

public class List<T> 
{ 
    public List() 
    { 
    } 
} 

L'idée est que, dans la déclaration de classe, T est déjà connue - vous spécifiez uniquement les paramètres de type lorsque vous souhaitez ajouter plus d'entre eux, par exemple pour une méthode générique comme ConvertAll.

+0

donc, suggérez-vous que je retire la partie générique de ma classe dérivée? –

+0

Juste dans le constructeur. Le constructeur lui-même n'est pas générique. Je vais ajouter cela à ma réponse. –

Questions connexes