Якщо квадрат - це тип прямокутника, то чому квадрат не може успадкувати прямокутник? Або чому це поганий дизайн?
Я чув, як люди кажуть:
Якщо ви зробили квадратний похід від прямокутника, то квадрат повинен бути корисним у будь-якому місці, де ви очікуєте прямокутник
У чому тут проблема? І чому площа може бути корисною в будь-якому місці, де ви очікуєте прямокутник? Він може бути корисним лише тоді, коли ми створимо об'єкт Square, і якщо ми перекриємо методи SetWidth і SetHeight для Square, ніж чому б виникала проблема?
Якщо у базового класу прямокутників у вас були методи SetWidth та SetHeight, а якщо ваш посилання на прямокутник вказав на квадрат, то SetWidth та SetHeight не мають сенсу, оскільки встановлення одного змінює інше на відповідне. У цьому випадку Квадрат не дає тесту заміщення Ліскова прямокутником, і абстракція того, що наслідувати квадрат прямокутника, є поганою.
Чи може хтось пояснити вищезазначені аргументи? Знову ж таки, якби ми переоцінили методи SetWidth і SetHeight в Square, чи не вирішить це питання?
Я також чув / читав:
Справжня проблема полягає в тому, що ми не моделюємо прямокутники, а скоріше "змінні прямокутники", тобто прямокутники, ширина чи висота яких можна змінити після створення (і ми все ще вважаємо це одним і тим же об'єктом). Якщо ми подивимось на клас прямокутника таким чином, то зрозуміло, що квадрат не є "прямозамінним прямокутником", тому що квадрат не може бути перероблений і все-таки бути квадратом (загалом). Математично ми не бачимо проблеми, оскільки змінність навіть не має сенсу в математичному контексті
Тут я вважаю, що "повторно помітний" - це правильний термін. Прямокутники є "повторно значущими", як і квадрати. Я щось пропускаю у наведеному аргументі? Квадрат можна змінити за розміром, як і будь-який прямокутник.
Why do we even need Square
? Це як мати дві ручки. Одна блакитна ручка і одна червона блакитна, жовта або зелена ручка. Синя ручка є зайвою - тим більше у випадку квадратної, оскільки вона не має вигоди за витратами.