14

我有两个具有相同方法的接口

   interface FirstInterface
   {
     int add(int x, int y);
   }

   interface SecondInterface
   {
      int add(int x, int y);
   }

   class TestInterface:FirstInterface,SecondInterface
   {
     public TestInterface() {}

     public int add(int x, int y)
     {
        return x + y;
     }
   }

在我的主要课程中

    static void Main(string[] args)
    {
        TestInterface t = new TestInterface();
        int result = t.add(3, 4);

    }

编译器没有给出任何错误并显示结果..

这样对吗 ??我们不应该使用FirstInterface.add吗?

这是否意味着接口在编译时被解析

4

3 回答 3

15

它是接口的显式或隐式实现的主题。

如果您实现Interface Aand Interface B,并且它们都有一个名为 的成员Foo,这是一个方法,那么如果您在一个类中实现这些接口,那么您唯一的方法Foo将对它们都计数。这是设计使然,坦率地说,我认为没有其他方法可以解决这个问题。

要分别实现它们,您必须使用Explicit Interface Implementation,即在Foo方法名称前面加上接口名称和一个点,例如InterfaceA.Fooand InterfaceB.Foo

引用C# 规范

20.3 完全限定的接口成员名称

接口成员有时由限定的接口成员名称引用。限定的接口成员名称由标识声明该成员的接口的名称、后跟一个点和该成员的名称组成。

于 2013-11-13T05:39:42.993 回答
0

这是隐式接口实现,因此该方法现在也与 TestResult 的实例相关联。这意味着您可以在具有具体类句柄的实例以及具有 IFirstInterface 句柄的实例上调用该方法。

FirstInterface interfaceHandle = new TestInterface();
interfaceHandle.add();

也会起作用

于 2013-11-13T05:41:23.613 回答
0

关于实施的博客。

您在这里所做的是隐式实现接口。通过隐式接口实现,您可以访问接口方法和属性,就好像它们是类本身的一部分一样。

而在显式实现中,您可以通过将它们视为接口来访问它们

于 2013-11-13T05:50:50.167 回答