powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вопрос о принципах ООП.
19 сообщений из 19, страница 1 из 1
Вопрос о принципах ООП.
    #36780601
Фотография deniskodua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книге Трея Неша "C# 2010 ускоренный курс для профессионалов" на стр 146 говориться о том, что наследование может разрушить инкапсуляцию.
Цитирую:
Другой важный аспект наследования состоит в том, что оно может быть вредным: наследование может разрушить инкапсуляцию и всегда усиливает связанность.
Наверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция. Если это так, то зачем разрушать её? Если в поддержку инкапсуляции базовый тип содержит защищённые поля, а вы нарушаете целостность оболочки инкапсуляции и открываете внутренности базового класса, то это не может быть хорошо.
Ниже рассматриваются доступные альтернативы, которые позволяют разработать лучший дизайн.
Многие описывают наследование как повторное использование типа "белого ящика".
Лучшая форма повторного использования - это "черный ящик", когда внутренности обета не открываются внешнему миру. Достичь этого можно, применив отношение включения (containment).
Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции. Недостаток такого приёма связан с тем, что в большинстве языков, включая C#, это потребует чуть больше работы по кодированию, хотя не на много. Зато в результате получится более адаптируемый дизайн.
Конец цитаты.
Так вот мне не понятно КАК НАСЛЕДОВАНИЕ РАЗРУШАЕТ ИНКАПСУЛЯЦИЮ!?!?
Объявляем поля как prived и они не будут доступны в наследнике.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36780605
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видимо имелась в виду инкапсуляция и наследование в C#
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36780608
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может неточности перевода?
ведь применяют агрегацию вместо наследования не в целях инкапсуляции.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36780640
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрушает по ряду причин
защищенные поля
виртуальные методы, например не заюзал Template method где следует, наследник переопределил метод, поломал класс
добавил в базовый класс метод - он появился во всех дочерних, возможны какие то конфдикты итд

Вообщем смысл в том, что класс уже перестает быть вещью в себе, а часть его внутренностей выносится в другие места. Бывает очень легко запутаться в витиеватой иерархии наследования, и в один прекрасный момент, когда тебе надо поменять нечто в базовом классе, ты начинаешь упорно думать, а не поломаешь ли ты нечто в 10 местах. С другой стороны предпочитая делегацию наследованию таких проблем можно избежать. Вообще делегация и полиморфизм через интерфейсы "наш" метод :-)
ЗЫ. Я не против наследования, это очень мощная вещь, но я всецело согласен с Нешем по данному вопросу.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36781401
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis.Разрушает по ряду причин
защищенные поля
виртуальные методы, например не заюзал Template method где следует, наследник переопределил метод, поломал класс
добавил в базовый класс метод - он появился во всех дочерних, возможны какие то конфдикты итд

Вообщем смысл в том, что класс уже перестает быть вещью в себе, а часть его внутренностей выносится в другие места. Бывает очень легко запутаться в витиеватой иерархии наследования, и в один прекрасный момент, когда тебе надо поменять нечто в базовом классе, ты начинаешь упорно думать, а не поломаешь ли ты нечто в 10 местах. С другой стороны предпочитая делегацию наследованию таких проблем можно избежать. Вообще делегация и полиморфизм через интерфейсы "наш" метод :-)
ЗЫ. Я не против наследования, это очень мощная вещь, но я всецело согласен с Нешем по данному вопросу.
Я думаю что тут ещё возможен случай, когда переопределяется функция, с более широким модификатором доступа, чем в базовом классе. Например было protected, стало public.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36781523
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНаверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция.
не важная,
не фундаментальная,
и, вообще, не объектно ориентированная концепция.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36781524
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, возможно, и не концепция
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36781555
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizавторНаверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция.
не важная,
не фундаментальная,
и, вообще, не объектно ориентированная концепция.

на счет того что не важная - не согласен.
программирование - борьба со сложностью, а инкапсуляция здесь помогает.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36782061
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tchingizа, возможно, и не концепция
Конечно нет. Побочный эффект модульности.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36782475
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом.
ИМХО, либо бред и чел сам не понял что написал, либо перевод.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36782832
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом.
ИМХО, либо бред и чел сам не понял что написал, либо перевод.

читал эту книгу, и с автором согласен, и главное - он не единственный кто такое советует.
также автор советует герметизировать все классы, если только автор класса специально не спроектировал его, как базовый для наследования.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36783055
Фотография deniskodua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже больше :)
Ещё автор говорит, что "Ещё один не достаток применения наследования заключается в том, что оно не динамично. Наследование статично в силу того факта, что определяется на этапе компиляции. Такое положение дел может оказаться, как минимум, весьма ограничивающим. Применяя включение, вы устраняете это ограничение. Однако чтобы сделать это, также следует заручиться поддержкой со стороны хорошего друга - полиморфизма. При этом включающий тип может быть, скажем, интерфейсным типом. Тогда включаемый объект просто должен поддерживать контракт этого интерфейса, чтобы повторно использоваться контейнером. Более того, этот объект можно изменить во время выполнения. Задумайтесь об этом на минутку. Предположим, что есть объект, представляющий контейнер сортируемых объектов. В этом контейнерном типе предусмотрен алгоритм сортировки по умолчанию. Если вы реализуете этот алгоритм по умолчанию как включаемый тип, который можно подменить вовремя выполнения, тогда, если того требует предметная область, вы всегда сможете заменить его собственным специальным алгоритмом сортировки - до тех пор, пока объект нового алгоритма сортировки реализует необходимый интерфейс, ожидаемый контейнерным типом. Такая техника известна как шаблон проектирования Strategy (Стратегия)"

Действительно что ли наследование это не так уж и хорошо...
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36783924
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deniskoduaИ даже больше :)
Ещё автор говорит, что "Ещё один недостаток применения наследования заключается в том, что оно не динамично. Наследование статично в силу того факта, что определяется на этапе компиляции. Такое положение дел может оказаться, как минимум, весьма ограничивающим. Применяя включение, вы устраняете это ограничение. Однако чтобы сделать это, также следует заручиться поддержкой со стороны хорошего друга - полиморфизма. При этом включающий тип может быть, скажем, интерфейсным типом. Тогда включаемый объект просто должен поддерживать контракт этого интерфейса, чтобы повторно использоваться контейнером. Более того, этот объект можно изменить во время выполнения. Задумайтесь об этом на минутку. Предположим, что есть объект, представляющий контейнер сортируемых объектов. В этом контейнерном типе предусмотрен алгоритм сортировки по умолчанию. Если вы реализуете этот алгоритм по умолчанию как включаемый тип, который можно подменить вовремя выполнения, тогда, если того требует предметная область, вы всегда сможете заменить его собственным специальным алгоритмом сортировки - до тех пор, пока объект нового алгоритма сортировки реализует необходимый интерфейс, ожидаемый контейнерным типом. Такая техника известна как шаблон проектирования Strategy (Стратегия)"

Действительно что ли наследование это не так уж и хорошо...

он так рано или поздно всё-таки придумает MOP =)
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36784593
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deniskoduaИ даже больше :) ......
Действительно что ли наследование это не так уж и хорошо... Наследование оч. хорошо там, где оно действительно нужно.
Если Вам нужны из некоего класса какие-то его методы и данные и типа все, то действительно, либо создаешь экземпляр, либо интерфейс, в зависимости от аппетита.
Это как с кошками. Вы просто не умеете их готовить. :)
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36787592
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом.
ИМХО, либо бред и чел сам не понял что написал, либо перевод.
Это нормальный подход, если полиморфизм не требуется.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36787640
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvin

он так рано или поздно всё-таки придумает MOP =)
Вы про какой МОР? Гугл сходу выдал несколько вариантов.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36787827
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLok0rvin

он так рано или поздно всё-таки придумает MOP =)
Вы про какой МОР? Гугл сходу выдал несколько вариантов.
наверное лисповский
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36788796
Фотография distinger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фаулер агрегацию определяет как вид наследования.
...
Рейтинг: 0 / 0
Вопрос о принципах ООП.
    #36789458
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN
наверное лисповский
ну MOP он сам по себе, например SmallTalk поддерживает MOP, в Ruby вроде элементы есть (а может и полноценный)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вопрос о принципах ООП.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]