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

时间:2011-01-09 07:45:22

标签: c# oop interface-implementation

//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 个答案:

答案 0 :(得分:9)

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

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

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

实际上是一样的。

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

答案 1 :(得分: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。因此,它可以被视为i11i22对象。以下两行代码都可以使用。

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

我可以在任一对象上调用m11方法,但它总是使用对象ab上找到的方法的具体实现。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

该方法不是界面方法 将调用的方法是类m11的{​​{1}}方法。