2011-01-09 6 views
3
//inteface i11 
public interface i11 
    { 
     void m11(); 
    } 
//interface i22 
    public interface i22 
    { 
     void m11(); 
    } 

//class ab implements interfaces i11 and i22 
    public class ab : i11, i22 
    { 
     public void m11() 
     { 
      Console.WriteLine("class"); 
     } 
    } 

jetzt, wenn in Main() Methode, die wir ein Objekt der Klasse ab schaffen wird, das Interface-Methode aufgerufen bitte alle erklären.Klasse Implementieren von zwei Schnittstellen, die die gleiche Methode definieren

+1

Es würde keinen Unterschied machen, da beide Schnittstellen ein 'void m11();' deklarieren, das es implementiert? – BoltClock

+1

Wenn dies ein echtes Beispiel ist, würde ich Ihnen wirklich raten, etwas an Ihren Klassen-, Interface- und Methodennamen zu tun. Mit aussagekräftigen Namen hilft die Lesbarkeit enorm. –

Antwort

4

Schnittstellen sagen nur: "Alles, was diese Schnittstelle implementiert, kann sicher sein, diese Methoden zu haben".
Wenn Sie in diesem Kontext darüber nachdenken, werden Sie sehen, dass es die Methode der Schnittstelle nicht aufruft; es implementiert lediglich die erforderlichen Methodenaufrufe.

9

Es gibt nur eine Methodenimplementierung, so dass offensichtlich aufgerufen wird, unabhängig vom Typ der Referenz. D.h .:

i11 o = new ab(); 
o.m11(); 

und

i22 o = new ab(); 
o.m11(); 

effektiv gleich sind.

ab.m11 erfüllt die Signatur der Methode in beiden Schnittstellen. Außerdem verwenden Sie nicht explicit interface implementation, so dass dies kein Faktor ist.

+0

richtig !! vielen Dank – Neo

0

Die Methode ist keine Schnittstellenmethode.
Die Methode, die aufgerufen wird, ist die m11 Methode der Klasse ab.

4

Sie verwechseln die Implementierung einer Schnittstelle mit der Erweiterung der konkreten Klasse. Ich glaube, dass dies dazu führt, dass Sie die Beziehung rückwärts denken. Eine Schnittstelle hat definitionsgemäß keine konkrete Implementierung. Es definiert nur einen Vertrag, den implementierende Klassen verwenden müssen. Vielleicht kann ein Beispiel zur Klärung beitragen.

Angenommen, wir haben eine Schnittstelle namens IBank. Diese Schnittstelle hat folgende Definition:

IBank 
{ 
    void AddMoney(int amount); 
    void RemoveMoney(int amount); 
    int GetBalance(); 
} 

Dann haben wir eine konkrete Implementierung dieser Schnittstelle haben wie folgt:

EuroBank : IBank 
{ 
    void AddMoney(int amount){ balance+= amount; } 
    void RemoveMoney(int amount){ balance-= amount; } 
    int GetBalance(){ return balance; } 
    private int balance; 
} 

Ich kann nicht eine neue Instanz von IBank erstellen. Der folgende Code wird nicht kompiliert.

IBank bank = new IBank; 

Stattdessen muss ich eine neue konkrete Instanz einer Bank schaffen, die ich als IBank behandeln kann. Ich kann dann Methoden für diese Klasse aufrufen.

IBank bank = new EuroBank; 
bank.AddMoney(7); 

Also, wenn ich rufe AddMoney, ich die Methode durch die Schnittstelle definiert, aber ich bin tatsächlich die konkrete Umsetzung von AddMoney auf der EuroBank-Klasse aufrufen.

Also in Ihrem Beispiel rufen Sie die m11 Methode auf der ab Klasse. ab implementiert jedoch sowohl i11 als auch i22. Daher kann es sowohl als ein i11 und i22 Objekt behandelt werden. Beide folgenden Codezeilen funktionieren.

i11 first = new ab(); 
i22 second = new ab(); 

kann ich die m11 Methode auf beiden Objekt aufrufen, aber es wird die konkrete Umsetzung des Verfahrens auf dem ab Objekt gefunden immer verwenden.