インターフェイスの実装と具象クラスの拡張を混同しています。これが関係を逆に考えさせていると思います。定義上、インターフェースには具体的な実装はありません。実装クラスが使用しなければならないコントラクトのみを定義します。おそらく、例が明確にするのに役立ちます。
と呼ばれるインターフェースがあるとします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
。