Информация об изменениях

Сообщение Re[8]: Расскажите про интерфейсы от 21.01.2019 8:02

Изменено 21.01.2019 12:06 Kswapd

Re[8]: Расскажите про интерфейсы
Здравствуйте, _NN_, Вы писали:

_NN>Основная проблема это наследование состояния, а его в интерфейсе нет.

_NN>Не хотите реализацию по умолчанию, переопределяйте все методы по старинке. Никто не запрещает.

И зачем тогда методы с реализацией в интерфейсе? Замусоривание синтаксиса, ничего более. Если уж так нужно, можно сделать абстрактный класс. Но вообще не нужно. Интерфейс служит для объявления контракта — всё. Остальное излишне и может только добавить в код избыточную сложность.

_NN>Кстати, методы расширения тоже нарушают чистоту ?

_NN>[c#]
_NN>interface MyInterface { int G(); }

_NN>static class InterfaceExtensions

_NN>{
_NN> public static int F(this MyInterface i) { return i.G() + 1; }
_NN>}

А тут всё нормально: есть чистый интерфейс, есть реализующий его класс. Или от InterfaceExtensions предполагается наследование? Тогда плохо. Наследование реализации лучше заменить агрегированием — структура программы получается намного проще.
Re[8]: Расскажите про интерфейсы
Здравствуйте, _NN_, Вы писали:

_NN>Основная проблема это наследование состояния, а его в интерфейсе нет.

_NN>Не хотите реализацию по умолчанию, переопределяйте все методы по старинке. Никто не запрещает.

И зачем тогда методы с реализацией в интерфейсе? Замусоривание синтаксиса, ничего более. Если уж так нужно, можно сделать абстрактный класс. Но вообще не нужно. Интерфейс служит для объявления контракта — всё. Остальное излишне и может только добавить в код избыточную сложность.

_NN>Кстати, методы расширения тоже нарушают чистоту ?

_NN>[c#]
_NN>interface MyInterface { int G(); }

_NN>static class InterfaceExtensions

_NN>{
_NN> public static int F(this MyInterface i) { return i.G() + 1; }
_NN>}

А тут всё нормально: есть чистый интерфейс, есть код подстановки. В функцию F будут передаваться экземпляры конкретных классов, реализующих MyInterface.