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 的对象时,将调用哪个接口方法,请解释一下。

4

4 回答 4

9

只有一种方法实现,因此很明显,无论引用的类型如何,都会调用它。IE:

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

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

实际上是相同的。

ab.m11满足两个接口中方法的签名。此外,您没有使用显式接口实现,因此这不是一个因素。

于 2011-01-09T07:47:54.083 回答
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,我使用的是接口定义的方法,但实际上我调用的是类AddMoney上的具体实现EuroBank

因此,在您的示例中,您正在调用该类的m11方法ab。但是,ab同时实现i11i22。因此,它可以被视为既是对象i11又是i22对象。以下两行代码都可以工作。

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

我可以m11在任一对象上调用该方法,但它将始终使用在该对象上找到的方法的具体实现ab

于 2011-01-09T07:59:53.287 回答
4

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

于 2011-01-09T08:34:11.917 回答
0

该方法不是接口方法。
将被调用的m11方法是类的方法ab

于 2011-01-09T07:48:18.653 回答