Наследование множественного интерфейса в С#
У меня есть два интерфейса с одним и тем же методом
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
Блог о внедрении.
То, что вы здесь делаете, реализует интерфейс неявно. При реализации неявного интерфейса вы получаете доступ к интерфейсным методам и свойствам, как если бы они были частью самого класса.
Если в явной реализации вы можете получить к ним доступ, рассматривая их как интерфейс