您将接口的实现与具体类的扩展混淆了。我相信这会导致你倒退思考这种关系。根据定义,接口没有具体的实现。它只定义了实现类必须使用的契约。也许一个例子可以帮助澄清。
假设我们有一个名为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
。