Реализация нескольких интерфейсов с общим родителем
Припустим, у меня есть интерфейс с методом A. Я создаю два дочерних к нему интерфейса, один имеет метод B, второй - метод C. После чего создаю класс, реализующий оба дочерних интерфейса, и объявляю там методы A, B и C. Не возникнет ли проблем с реализацией метода А? Чаще всего насчет ситуаций с одинаковыми именами методов в интерфейсах предлагают отдельную реализацию. Мне, к примеру, нужно, чтобы там выполнялось только одно действие. Или стоит вынести метод A в отдельный интерфейс?

Лучший ответ:
реализован в классе.
Скользкое понятие.
В любом случае, даже если дочерний интерфейс переобъявит метод A() вот так:
interface iB
{ new void A(); void B(); }
и твой класс Class_Example реализует его, у тебя будут выполнятся одни и те же действия
  1. И в случае iB b = new Class_Example(); b.A()
  2. И в случае iA a = new Class_Example(); a.A();
  3. И в случае Class_Example class_name = new Class_Example(); class_name.A().
В случае, когда интерфейс не переобъявляет метод A() даже говорить не приходиться - тем более будут те же действия.
Вообще здесь такая штука, по моему мнению конкретно в этом случае надо разбираться по факту проблемы, а не по возможной проблеме.
P.S.
Насчет интерфейсов "Полный справочник по C#" , стр 320.



Просмотров: 3 299

» Лучшие комментарии


GeneralElConsul #1 - 5 лет назад (отредактировано ) 0
А какие проблемы могут возникнуть?
Если ты не переопределяешь метод А с помощью слова "new" в дочерних интерфесах iB и iC, то все дороги ведут в Рим - к методу A() интерфеса iA.
void Do(iB par)
{ par.A(); } будет вызван iA.A() - так говорит компилятор
Уточнения насчет проблем пригодились бы.
lentinant #2 - 5 лет назад (отредактировано ) 0
GeneralElConsul, понятно. Просто мало работал с интерфейсами, и не особо понятно, если у меня класс наследуется от трех интерфейсов с одинаково названным методом, то какой из них будет реализован в классе.
GeneralElConsul #3 - 5 лет назад (отредактировано ) 0

реализован в классе.
Скользкое понятие.
В любом случае, даже если дочерний интерфейс переобъявит метод A() вот так:
interface iB
{ new void A(); void B(); }
и твой класс Class_Example реализует его, у тебя будут выполнятся одни и те же действия
  1. И в случае iB b = new Class_Example(); b.A()
  2. И в случае iA a = new Class_Example(); a.A();
  3. И в случае Class_Example class_name = new Class_Example(); class_name.A().
В случае, когда интерфейс не переобъявляет метод A() даже говорить не приходиться - тем более будут те же действия.
Вообще здесь такая штука, по моему мнению конкретно в этом случае надо разбираться по факту проблемы, а не по возможной проблеме.
P.S.
Насчет интерфейсов "Полный справочник по C#" , стр 320.
Doc #4 - 5 лет назад 0
Чего за вопрос
В интерфейсах методы не реализуются
Интерфейсы содержат сигнатуры методов
Если сигнатура совпадает то в чем вообще вопрос?
nvc123 #5 - 5 лет назад (отредактировано ) 0
Doc, вопрос в том что такое интерфейс
то что автор не понимает что из себя представляет интерфейс очевидно из текста вопроса
и лично мне кажется что в джаве интерфейсы больше распространены чем в шарпе, что может служить оправданием для автора
lentinant #6 - 5 лет назад 0
Никто не говорил, что я реализую методы в интерфейсах. Не понимаю, откуда вы это взяли.
alexprey #7 - 5 лет назад 0
Мне кажется что автор не понимаю что он хочет и то что он привел звучит очень странно. И вообще наследование интерфейсов это не менее странно
nvc123 #8 - 5 лет назад 0
alexprey, наследование интерфейсов иногда применяется(как правило наследуют интерфейс из API)
alexprey #9 - 5 лет назад 0
nvc123, в редких случаях. Но использовать 3 интерфейса, которые друг друга наследуют....
это уже попахивает костылями
lentinant #10 - 5 лет назад (отредактировано ) 0
alexprey, начитавшись примеров по SOLID (которому в определенной мере должен следовать мой код на работе), я изначально предположил, что интерфейсы обычно придумываются так, чтобы был смысл создавать объект, реализующий только этот интерфейс. То есть, если у меня есть методы А, B и C, и у меня вряд ли будут объекты, которым будет нужен исключительно метод B или C, то нет смысла создавать отдельно интерфейс на каждый из них. Поэтому я решил, что для этих четырех случаев (объект использует только метод А, объект использует методы A и B, объект использует методы A и C, объект использует все методы) лучше всего сделать базовый интерфейс с обозначением метода А (сам по себе подходит для первого случая), от него создать интерфейсы с методами B и C (подходят для второго и третьего случаев), а для четвертого случая оптимально будет наследовать класс от второго и третьего интерфейса.
Но это было вчера, я с того времени существенно поменял "мировоззрение", и теперь у меня методы B и C, все же, в отдельных интерфейсах, независящих от интерфейса с методом А.
И это не меняет суть вопроса, который был не "стоит ли это использовать", а "как это работает". На который мне, кстати, уже давно дали ответ.
Devion #11 - 5 лет назад (отредактировано ) 0
public interface IFirst
{
    void A();
}

public interface ISecond
{
    void A();
}
Обращаем внимание на инкапсуляцию
public class MyClass1 : IFirst, ISecond
{
    void IFirst.A()
    {
        
    }

    void ISecond.A()
    {
        
    }
}

public class MyClass2 : IFirst, ISecond
{
    public void A()
    {

    }
}
Просто к теме за реализацию интерфейсов
alexprey #12 - 5 лет назад 0
Extravert, а MyClass2 разве будет работать?
Devion #13 - 5 лет назад (отредактировано ) 0
alexprey, да
MyClass2 реализует общий для двух интерфейсов метод A(). Сами интерфейсы, как бы сказать, они же не содержат метода как таковые, они обязывают к реализации и абстрагируют. А один и тот же метод это или два разных уже другое дело.
Я почему-то думал, что второй способ как раз не вызывает вопросов :) в то время как с первым все не так гладко - чтобы использовать методы нужно приводить экземпляр к интерфейсу. А еще их "смешивать" можно.
Doc #14 - 5 лет назад 3
Вы че прикалываетесь? MyClass1 это буллщит полный, такого не должно быть имхо, никому не советую такое нигде использовать, почему вообще такое можно писать - большой вопрос
prog #15 - 5 лет назад 0
почему вообще такое можно писать
Это же шарпы, если не ошибаюсь, там и не такое бывает.
Devion #16 - 5 лет назад (отредактировано ) 0
Doc, булщит - да. Не стоит такого делать - да.
Вероятно, эта функция предусмотрена на случаи, когда разные интерфейсы разных библиотек просят реализовать метод с одинаковым названием. Модульный подход предусматривает автономные, несвязанные между собой вещи и это как бы намекает, что такие ситуации имеют место быть. В таких случаях такое решение лучше чем его отсутствие.
Это примерно та же история, что и с пространствами имен - там есть вероятность совпадения имен классов, тут есть вероятность совпадения имен методов. Только решается разными способами, а причины общие - избежать двоякости.
Кстати интересно как такая конструкция поведет себя под рефлексией - что там покажет. И попробовать, откроется ли под дерефлектором этот код.
prog #17 - 5 лет назад (отредактировано ) 0
Extravert, в такой ситуации, как по мне, лучше во враппер завернуть, чем ломиться в лоб.
alexprey #18 - 5 лет назад 0
Extravert, откроется, иначе бы это и не работало вовсе)
GeneralElConsul #19 - 5 лет назад 1
Знаешь, что самое забавное ? XD
Тот пример, который ты привел, и есть причина, почему в C# сделали множественное наследование интерфейсов и одиночное классов)