Была книга, в которой говорилось о наличии класса PhoneNumber
, а затем мы определяли бы класс Address
, наследуемый от PhoneNumber
, и я как-то сказал, что мы не можем этого сделать, потому что адрес — это не номер телефона, а чтобы наследовать, это должно быть отношение «является». Например: собака — это животное, и мы можем сделать так, чтобы Dog
наследовалось от Animal
.
Но поскольку мы должны следовать LSP — принципу замены Лисков, то правило "является" на самом деле здесь не является определяющим фактором, потому что квадрат «является» прямоугольником (с шириной == высотой), но LSP говорит, что мы не можем определить класс Square
и наследовать от класса Rectangle
. Простое объяснение на английском, я думаю, таково: объект aRect
может ответить на сообщение setWidthAndHeight(w, h)
, но aSquare
не может ответить на него правильно и позволить всей программе работать правильно.
Удивительно, но класс Address
, наследующий класс PhoneNumber
, нарушает отношение "есть", но не нарушает LSP. Тогда формально, какой принцип ООП он нарушает?
Address
может иметь более одной причины для изменения, если он наследует отPhoneNumber
, что нарушает принцип единой ответственности. Более того, кто сказал, что SOLID были принципами ООП (рассмотрите GRASP, Закон Деметры, DRY, KISS). - person RA.   schedule 24.02.2013aSquare
не может ответитьsetWidthAndHeight(w, h)
? - person Bob Horn   schedule 24.02.2013setWidthAndHeight
: еслиw
иh
оба являются положительными числами, ширина и высотаaSquare
должны равняться им соответственно. - person A. Rodas   schedule 24.02.2013width
иheight
игнорируется, то это побочный эффект, или если исходная программа устанавливаетheight
на0
и устанавливаетwidth
на750
так, чтобы это была горизонтальная линия, теперь внезапно она становится большой рамкой. из750 x 750
, потому что в результате0
был проигнорирован. - person nonopolarity   schedule 24.02.2013w
не равноh
, вы усиливаете предусловие в подтипе, а это не разрешено в соответствии с правилами о предусловиях и постусловиях (другая ссылка: стр. 7 этой статьи ObjectMentor). - person A. Rodas   schedule 25.02.2013