Вы путаете реализацию интерфейса с расширением конкретного класса. Я считаю, что это заставляет вас думать об отношениях в обратном направлении. Интерфейс по определению не имеет конкретной реализации. Он только определяет контракт, который должны использовать реализующие классы. Возможно, пример может помочь уточнить.
Предположим, у нас есть интерфейс с именем IBank
. Этот интерфейс имеет следующее определение:
IBank
{
void AddMoney(int amount);
void RemoveMoney(int amount);
int GetBalance();
}
Тогда у нас есть конкретная реализация этого интерфейса следующим образом:
EuroBank : IBank
{
void AddMoney(int amount){ balance+= amount; }
void RemoveMoney(int amount){ balance-= amount; }
int GetBalance(){ return balance; }
private int balance;
}
Я не могу создать новый экземпляр IBank
. Следующий код не скомпилируется.
IBank bank = new IBank;
Вместо этого я должен создать новый конкретный экземпляр банка, который я могу рассматривать как IBank
. Затем я могу вызвать методы этого класса.
IBank bank = new EuroBank;
bank.AddMoney(7);
Поэтому, когда я вызываю AddMoney
, я использую метод, определенный интерфейсом, но на самом деле я вызываю конкретную реализацию AddMoney
в классе EuroBank
.
Итак, в вашем примере вы вызываете метод m11
класса ab
. Однако ab
реализует как i11
, так и i22
. Следовательно, он может рассматриваться как объект i11
и i22
. Обе следующие строки кода будут работать.
i11 first = new ab();
i22 second = new ab();
Я могу вызвать метод m11
для любого объекта, но он всегда будет использовать конкретную реализацию метода, найденного для объекта ab
.