Наследование множественного интерфейса в С#

У меня есть два интерфейса с одним и тем же методом

   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??

означает ли это, что интерфейсы разрешены во время компиляции?

Ответы

Ответ 1

Это тема Явная или неявная реализация интерфейсов.

Если вы реализуете Interface A и Interface B, и оба они имеют член с именем Foo, который является методом, то, если вы реализуете эти интерфейсы в одном классе, ваш единственный метод Foo будет учитываться как для из них. Это по дизайну, и, честно говоря, я думаю, что для этого нет другого пути.

Чтобы реализовать их отдельно, вы должны использовать Explicit Interface Implementation, то есть вы префикс имени метода Foo с именем интерфейса и точкой, например InterfaceA.Foo и InterfaceB.Foo.

Цитата из Спецификация С#:

20.3 Полноценные имена членов интерфейса

Элемент интерфейса иногда называют квалифицированным именем члена интерфейса. Имя члена квалифицированного интерфейса состоит из имени, идентифицирующего интерфейс, в котором объявлен член, а затем точка, за которым следует имя члена.

Ответ 2

Это неявная реализация интерфейса, поэтому метод теперь связан с экземпляром TestResult. Это означает, что вы можете вызвать метод в обоих экземплярах с помощью конкретного дескриптора класса, а также экземпляры с дескриптором IFirstInterface.

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

Будет также работать

Ответ 3

Блог о внедрении.

То, что вы здесь делаете, реализует интерфейс неявно. При реализации неявного интерфейса вы получаете доступ к интерфейсным методам и свойствам, как если бы они были частью самого класса.

Если в явной реализации вы можете получить к ним доступ, рассматривая их как интерфейс