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.
Es würde keinen Unterschied machen, da beide Schnittstellen ein 'void m11();' deklarieren, das es implementiert? – BoltClock
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. –