История изменений
Исправление den73, (текущая версия) :
У принципа Лисков, кроме примеров, есть ещё и определение. Я про квадрат с прямоугольником вообще особо не говорил в этой теме.
Давай так: есть виджет «окружность», у него перекрыт виртуальный метод draw, так что он рисует, естественно, окружность.
Вопрос N1 - является ли частью «контракта» виджета «окружность» то, что он рисует окружность? Дурацкий вопрос, правда? Конечно, да, иначе зачем он ещё нужен?
Далее мы наследуем от виджета окружность и делаем виджет «круг», т.е. «окружность, заполненная внутри» - переопределяем виртуальный метод draw.
Далее мы пишем программу, рисующую окружность. Далее в ней заменяем виджет «окружность» виджетом «круг». И - вуаля! Мы по определению нарушили принцип Лисков, потому что поведение программы не должно было измениться от замены класса на подкласс (см. формулировку принципа Лисков).
Т.е., если мы хотим соблюдать принцип Лисков, то нельзя так наследовать. А теперь смотрим в реальный мир и что видим? Не такое ли наследование мы видим сплошь и рядом?
В чём проблема с моим рассуждением?
Исправление den73, :
У принципа Лисков, кроме примеров, есть ещё и определение. Я про квадрат с прямоугольником вообще особо не говорил в этой теме.
Давай так: есть виждет «окружность», у него перекрыт виртуальный метод draw, так что он рисует, естественно, окружность.
Вопрос N1 - является ли частью «контракта» виджета «окружность» то, что он рисует окружность? Дурацкий вопрос, правда? Конечно, да, иначе зачем он ещё нужен?
Далее мы наследуем от виджета окружность и делаем виджет «круг», т.е. «окружность, заполненная внутри» - переопределяем виртуальный метод draw.
Далее мы пишем программу, рисующую окружность. Далее в ней заменяем виджет «окружность» виджетом «круг». И - вуаля! Мы по определению нарушили принцип Лисков, потому что поведение программы не должно было измениться от замены класса на подкласс (см. определение принципа Лисков).
Т.е., если мы хотим соблюдать принцип Лисков, то нельзя так наследовать. А теперь смотрим в реальный мир и что видим? Не такое ли наследование мы видим сплошь и рядом?
В чём проблема с моим рассуждением?
Исходная версия den73, :
У принципа Лисков, кроме примеров, есть ещё и определение. Я про квадрат с прямоугольником вообще особо не говорил в этой теме.
Давай так: есть виждет «окружность», у него перекрыт виртуальный метод draw, так что он рисует, естественно, окружность.
Вопрос N1 - является ли частью «контракта» виджета «окружность» то, что он рисует окружность? Дурацкий вопрос, правда? Конечно, да, иначе зачем он ещё нужен?
Далее мы наследуем от виджета окружность и делаем виджет «круг», т.е. «окружность, заполненная внутри» - переопределяем виртуальный метод draw.
Далее мы пишем программу, рисующую окружность. Далее в ней заменяем виджет «окружность» виджетом «круг». И - вуаля! Мы по определению нарушили принцип Лисков, потому что поведение программы не должно было измениться (см. определение принципа Лисков).
Т.е., если мы хотим соблюдать принцип Лисков, то нельзя так наследовать. А теперь смотрим в реальный мир и что видим? Не такое ли наследование мы видим сплошь и рядом?