2017-09-22 8 views
0

私はインターフェイスの継承がどのように機能するかを理解しようとしています。インターフェイスが別のインターフェイスを継承するが、同じシグネチャを持つメソッドを持つ場合、コンパイラはベースメンバが隠されていることを警告します(これは論理的です)。インターフェイスの継承 - 親インターフェイスからのメソッドの隠蔽 - なぜ実装クラスに両方のメソッドを持たせることができますか?

しかし、後でクラスで子インターフェイスを実装すると、同じシグネチャを持つ親インターフェイスと子インターフェイスの両方のメソッドを実装する必要があり、これが混乱します...親メンバーが非表示になっていると子インタフェースメソッドのみを実装する必要がありますか?

IEnumerableIEnumerable<T>インターフェースを見ながら、私はこの時に来た)

interface IMyBase 
{ 
    int DoSomething(); 
} 

interface IMyDerived:IMyBase 
{ 
    int DoSomething(); 
} 


class myClass : IMyDerived 
{ 
    int IMyDerived.DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 

    int IMyBase.DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+3

明示的にインターフェイスを実装しています。その場合、継承はテーブルから外れています。 – CodeCaster

+0

インターフェイスのメンバーを非表示にすることはできません。クラスはありません –

+1

'IMyDerived'に' DoSomething() 'を入れないでください。既に' IMyBase'から継承しています。このインターフェイスに配置すると、ゼロ値が追加されます。私は実際にはコンパイラがこれについて不平を言って驚いていますか?私は少なくとも警告を期待するだろう。 – Liam

答えて

1

私は親と同じシグネチャを持つ児童・インタフェース・メソッドの両方を実装する必要があり、これは私に

を混乱させる

これを行うと何が起こるのでしょうか?

IMyBase x = new myClass(); 

x.DoSomething(); 

両方が、両方を呼び出すことができるので、存在しなければならない二つの方法、IMyBase.SomethingIMyDerived.Something、があります。 myClassはまだIMyBaseを実装していますが、インターフェイスは隠されていませんでした。

+0

この場合、コンパイラのメッセージを意味します "MyDerived.DoSomething()は継承されたメンバ 'IMyBase.DoSomething()' ...を隠蔽しますか? これはどのコンテキストで非表示になっていますか? – Jaxx

+0

@Jaxx 'IMyDerived'型で呼び出すとき、' IMyBase.DoSomething'は隠されています。 *その*メソッドにアクセスするには、最初に 'IMyBase'にキャストしなければなりません。 – nvoigt

関連する問題