Если этот код работал, вы можете продолжить, включив в test2
Circle
- таким образом, совершенно нарушающего гарантию того, что test1
делает, что только Rectangle
s никогда не будет вставлен в него.
Общий принцип (независимый от языка - вопрос логики - хотя и контр-интуитивный): мешок с бананами - это не мешок с фруктами ... в мире изменчивых объектов (мир функционального программирования, где каждый объект неизменен после создания, MUCH проще!). Это потому, что вы можете добавить яблоко в мешок с фруктами (так как яблоко - это кусок фруктов), но вы не можете добавить яблоко в сумку с бананами (так как яблоко не банан).
Кстати, это очень похоже на причину, по которой квадрат не является прямоугольником (опять же, в мире изменяемых объектов): потому что, учитывая (изменяемый) прямоугольник, вы можете мутировать обе стороны независимо, но, учитывая квадрат , вы не можете. (В геометрии квадрат IS действительно является прямоугольником - но это потому, что в геометрии, как в функциональном программировании, нет понятия «мутирования» объекта! -).