2017-10-17 16 views
0

インターフェイスと継承に問題があります。ここに私の問題:インターフェイスメンバーに一致する戻り値の型がないため実装できません

私は2つのインターフェイスがあります。

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

をして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"; } 
} 

を実装するクラスは、その後、私はエラーを得た:

'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>'."

私は私を理解書く必要があります

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

テンプレートトリックを知っていますが、それは別の種類のIElementAのリストでのみ動作します。

あなたの問題を解決するためのアイデアはありますか?

よろしく JM

+1

'List 'は 'List 'と同じ型ではないため、コンパイルエラーが発生します。 – DavidG

+1

を見てください*共変動* – Rahul

+0

DavidGは正しい答えを持っています – Picnic8

答えて

0

あなたはジェネリックを使用することができます。

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

} 

またはあなたが本当にここの継承を見れば(私はしないでください):

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

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

これはあなたがTの任意のタイプを指定することができますが、それはOPsコードとして制約されていません。 (私のDVではありません) – DavidG

+0

@DavidG、編集を参照してください、私は今日のこの時に何をやっているのか分かりません。それは理にかなっていますか? – Sinatr

0

あなたの場合あなたのリストに表示されるIterface実装を尊重してください:

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

だから、あなたがそれにElementB要素を追加することができます:あなたはこのリストにのみElementBをしたい場合は

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

、その上に挿入する前に型をチェック。

関連する問題