2017-10-17 15 views
0

J'ai des problèmes avec l'interface et l'héritage. Voici mon problème:impossible d'implémenter le membre d'interface car il n'a pas le type de retour correspondant

J'ai deux interfaces:

public interface IElementA 
{ 
    List<IElementA> Child { get; } 
} 

// The goal is to add some properties to the main interface 
public interface IElementB : IElementA 
{ 
    string Name { get; } 
} 

et une classe qui implémentent IElementB

public class ElementB : IElementB 
{ 
    protected List<ElementB> m_Child = new List<ElementB>(); 

    public List<ElementB> Child { get { return m_Child; } } 
    public string Name { get { return "element B"; } 
} 

Je suis l'erreur:

'ElementB' does not implement interface membre 'IElementA.Child'.

'ELementB.Child' cannot implement 'IElementA.Child' because it does not have the matching return type of 'List<IElementA>'."

Je comprends que je besoin d'écrire

public List<IElementA> Child { get { return m_Child; } } 

Et connaissez le tour de modèle, mais il fonctionne uniquement avec une liste de type différent de IElementA.

Avez-vous des idées pour résoudre mon problème?

Cordialement JM

+1

'Liste ' n'est pas du même type que 'Liste ', c'est pourquoi vous obtenez l'erreur de compilation. – DavidG

+1

regardez * Covariance * – Rahul

+0

DavidG a la bonne réponse – Picnic8

Répondre

0

Vous pouvez utiliser les médicaments génériques:

public interface IElementA<T> 
{ 
    List<T> Child { get; } 
} 

public interface IElementB 
{ 
    string Name { get; } 
} 

public class ElementB : IElementA<ElementB>, IElementB 
{ 
    protected List<ElementB> m_Child = new List<ElementB>(); 

    public List<ElementB> Child { get { return m_Child; } } 
    public string Name 
    { 
     get { return "element B"; } 
    } 

} 

ou si vous voyez vraiment l'héritage ici (je ne sais pas):

public interface IElementB<T> : IElementA<T> where T: IElementA<T> ... 

public class ElementB : IElementB<ElementB> ... 
+0

Cela vous permet de spécifier tout type pour T si, il n'est pas aussi contraint que le code OPs. (pas ma DV si) – DavidG

+0

@DavidG, voir modifier, je ne suis pas tout à fait sûr de ce que je fais à ce moment de la journée. Est-ce que ça fait du sens? – Sinatr

0

Si vous Respectez la mise en œuvre d'Iterface à laquelle votre liste ressemblera:

protected List<IElementA> m_Child = new List<IElementA>(); 
    public List<IElementA> Child { get { return m_Child; } } 

Vous pourrez ajouter élément ElementB en elle:

this.m_Child.Add(new ElementB()); 

Si vous ne souhaitez que ElementB dans cette liste, vérifiez le type avant l'insertion sur elle.