2011-01-09 128 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"); 
     } 
    } 

现在,当在main()方法中,我们创建AB类 的对象,接口方法将调用请说明一切。类实现两个接口定义相同的方法

+1

它不会有什么区别,因为两个接口声明一个`void m11();`它实现了什么? – BoltClock 2011-01-09 07:47:51

+1

如果这是一个真实的例子,我真的会建议你去做一些关于你的类,接口和方法的名字。具有描述性名称极大地有助于可读性。 – 2011-01-09 09:25:18

回答

4

接口只是说“任何实现这个接口的东西都可以肯定有这些方法”。
如果你在这种情况下思考它,你会发现它不会调用接口的方法;相反,它只是实现了所需的方法调用。

9

只有一个方法实现,所以显然被调用,而不管引用的类型如何。即:

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

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

实际上是相同的。

ab.m11满足两个接口中方法的签名。此外,你没有使用explicit interface implementation,所以这不是一个因素。

0

该方法不是接口方法。
将要调用的方法是m11ab的方法。

4

你在混淆具体类的扩展接口的实现。我相信这会让你思考这种关系。根据定义,接口没有具体的实现。它只定义了实施类必须使用的合同。也许一个例子可以帮助澄清。

假设我们有一个名为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,使用接口定义的方法我,但我其实呼吁EuroBank类的具体实施AddMoney

因此,在您的示例中,您正在调用ab类中的m11方法。但是,ab实现i11i22。因此,它可以被视为i11i22对象。以下两行代码都可以使用。

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

我可以调用对象的m11方法,但它总是会用具体的实施对象ab上发现的方法。

相关问题