Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, artelk, Вы писали:
I>На самом деле у интерфейса всегда есть семантика. Это не просто какие то названия, это соглашение вида синтаксис->семантика. Проблемы возникают именно из за этой семантики. Если закрыть глаза на семантику, то нет разницы, что от чего наследовать.
Да, но семантика IReadOnlyList отличается от предложенного тобой IImmutableList.
A>>Уфф.. давай с другой стороны. Что ты называешь расширением модуля. Когда при наследовании интерфейсов он не расширяется?
I>Это не мой термин
Уточнение — это подмножество некоторого типа. Например — круги определенного цвета. Расширение — объединение множеств. Например множества кругов и прямогольников.
I>Скажем, уточнением будет наследник IImmutableList, у которого добавится, скажем, immutable операция "GetDistinctItems"
I>Расширением будет такой наследник IImmutableList, у которого добавится операция "MakeDistinct" с семантикой изменения по месту.
Так расширение типа или модуля\интерфейса?
Понятно, что если само "расширение интерфейса" определить как "противоположность уточнению типа", то доказательство твоего утверждения становится тавтологичным.
Я же предлагаю придерживаться более интуитивного определения "расширения интерфейса" как просто добавление новых методов.
Тогда получается, что при наследовании интерфейсов обычно (за ислючением экзотики с пустыми интерфейсами-наследниками) происходит расширение интерфейса.
"Хорошо" это когда такое наследование сопровождается сужением\уточнением типа (тут принято вспоминать LSP, контрактное программирование и т.п.)