2017-09-22 1 views
0

Ich versuche zu verstehen, wie die Vererbung von Schnittstellen funktioniert. Wenn eine Schnittstelle eine andere Schnittstelle erbt, aber über eine Methode mit derselben Signatur verfügt, gibt der Compiler eine Warnung aus, dass das Basiselement ausgeblendet ist (und dies scheint logisch).Interface-Vererbung - Verbergen-Methode von der Eltern-Schnittstelle - warum kann ich beide Methoden in der implementierenden Klasse haben?

Wenn ich später die Kind-Schnittstelle in einer Klasse implementieren, muss ich sowohl die Eltern- als auch die Child-Interface-Methode mit der gleichen Signatur implementieren und das verwirrt mich ... Ich dachte, dass wenn das Elternelement I versteckt ist muss nur die Child-Interface-Methode implementieren?

(Ich kam auf diese während bei IEnumerable und IEnumerable<T> Schnittstellen suchen)

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

Sie implementieren die Schnittstellen explizit. In diesem Fall ist die Vererbung vom Tisch. – CodeCaster

+0

die Interface-Member können nicht versteckt werden, gibt es keine Klassen –

+1

Setzen Sie 'DoSomething()' nicht in 'IMyDerived', es erbt es bereits von' IMyBase'. Wenn Sie es in diese Schnittstelle einfügen, wird Null hinzugefügt. Ich bin wirklich überrascht, dass der Compiler sich nicht darüber beschwert? Ich würde zumindest eine Warnung erwarten. – Liam

Antwort

1

Ich habe zu implementieren sowohl die Eltern und das Kind Interface-Methode die gleiche Signatur aufweisen und das verwirrt mich

Was erwarten Sie dann, wenn Sie das tun?

IMyBase x = new myClass(); 

x.DoSomething(); 

Es gibt zwei Methoden, IMyBase.Something und IMyDerived.Something, beide haben zu existieren, weil beide aufgerufen werden können. myClass implementiert immer noch IMyBase, die Schnittstelle wurde in keiner Weise versteckt.

+0

In diesem Fall bedeutet das die Nachricht des Compilers "MyDerived.DoSomething() 'verbirgt das geerbte Mitglied' IMyBase.DoSomething() '..."? Es ist in welchem ​​Kontext versteckt? – Jaxx

+0

@Jaxx Beim Aufruf eines 'IMyDerived' -Typs ist' IMyBase.DoSomething' ausgeblendet. Sie müssten zuerst auf "IMyBase" umwandeln, um auf diese * Methode zuzugreifen. – nvoigt

Verwandte Themen