繁体   English   中英

类实现两个定义相同方法的接口

[英]Class Implementing Two Interfaces which Define the Same Method

//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的对象,接口方法将被调用,请解释所有。

只有一种方法实现,所以无论引用的类型如何,都会被调用。 IE:

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

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

实际上是一样的。

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

您将接口的实现与具体类的扩展混淆。 我相信这会让你想到这种关系倒退。 根据定义,接口没有具体的实现。 它只定义了实现类必须使用的契约。 也许一个例子可以帮助澄清。

假设我们有一个名为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上找到的方法的具体实现。

接口只是说“任何实现此接口的东西都可以确保具有这些方法”。
如果您在该上下文中考虑它,您将看到它不会调用接口的方法; 相反,它只是实现了所需的方法调用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM