Re[3]: Принцип подстановки Лисков (LSP из SOLID)
От: k.o. Россия  
Дата: 12.11.11 07:29
Оценка:
Здравствуйте, VladD2, Вы писали:

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


LVV>>Кстати о "правильности" наследования:

LVV>>

LVV>> спецификация. Дочерний класс реализует поведение, описанное в родительском классе. Ясно, что в С++ эта форма реализуется простым открытым наследованием от абстрактного класса;
LVV>> конструирование. Класс-наследник использует методы базового класса, но не является его подтипом (принцип подстановки не выполняется). В С++ такую форму можно реализовать простым закрытым наследованием;
LVV>> расширение. В класс-потомок добавляют новые методы, расширяя поведение родительского класса; принцип подстановки в такой форме выполняется;
LVV>> обобщение. Дочерний класс обобщает поведение базового класса. Обычно такое наследование используется в тех случаях, когда мы не можем изменить поведение базового класса (например, базовый класс является библиотечным классом);
LVV>> ограничение. Класс-наследник ограничивает поведение родительского класса. Очевидно, что в С++ такой вид наследования реализуется простым закрытым наследованием (пример — TUniversalDeque -> TStack );
LVV>> варьирование. Базовый класс и класс-потомок являются вариациями на одну тему, однако связь «класс-подкласс» произвольна, например, «квадрат-прямоугольник» или «прямоугольник-квадрат». Эта форма фактически не отличается от «конструирования», так как класс-наследник, очевидно, «использует методы базового класса, но не является его подтипом»;
LVV>> комбинирование. Дочерний класс наследует черты нескольких классов — это множественное наследование.


VD>Что только народ не придумает, чтобы оправдать использование наследования не по назначению?!


VD>А про возможность внутренние поля объявлять этот уважаемый автор не слышал?


А ты про empty base class optimization, не слышал? Или про ADL? В C++ наследование, всё-таки, даёт некоторые возможности, которые с помощью аггрегации не получишь. Между прочим, кто сказал, что единственное назначение наследования это выражение отношения тип — подтип согласно LSP?

B. Liskov "Data Abstraction and Hierarchy"

We are using the words "subtype" and "supertype" here to emphasize that now we are talking about
a semantic distinction. By contrast, "subclass" and "superclass" are simply linguistic concepts in
programming languages that allow programs to be built in a particular way. They can be used to
implement subtypes, but also, as mentioned above, in other ways.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.