Re[10]: Мнение: объектно-ориентированное программирование — к
От: artelk  
Дата: 03.10.19 09:57
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, artelk, Вы писали:


A>>>>Имхо, было бы полезно, если IList наследовался от IReadOnlyList. Это было бы уточнение типа или расширение модуля?

I>>>Разумеется расширение, потому как был Readonly, а стал read-write.
I>>>Сам подумай — некий класс ждет, что его данные не могут меняться. Но у тебя то на самом деле IList, то есть, можно модифицировать контейнер, — опаньки, взял, отредактировал, и всё сломал.
I>>>Нарушается принцип замещения Лисков.
A>>Неверно. IReadOnlyList не про иммутабельность. Класс List, например, реализует этот интерфейс, хотя его в иммутабельности трудно заподозрить.
I>Значит это нарушение ОО контракта, похоже исторически сложилось что IReadOnlyList никакой не read-only. Массив — да, List — нет.

Название интерфейса вводит в заблуждение, согласен. Но в контракте у него прописано:

Represents a read-only collection of elements that can be accessed by index.
The IReadOnlyList<T> represents a list in which the number and order of list elements is read-only. The content of list elements is not guaranteed to be read-only.

Допустим он назывался бы IListReadOnlyAccess, IReadableList или IListReader.
Мой вопрос остается в силе.

I>Тогда такой пример — IImmutableList, который гарантирует неизменность. Всё иммутабельно и тд. А теперь наследуем этот интерфейс, скажем, IOptimizedList и вставляем туда методы FastRemove, FastAdd и тд, которые будут удалять по месту.

I>Вроде ж всё хорошо — раз мы наследуем только интерфейс, то никаких подлянок ожидать не стоит. Гы-гы. Проверяем — передаем консумеру IImmutableList экземпляр IOptimizedList, он благополучно принимает и используем в своих целях. А мы тем временем модифицируем этот же инстанс.
I>Итого — откуда грабли? Мы ж только интерфейс наследуем...
Это все очевидно и к вопросу не относится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.