Někdo totiž může říct, že obdelník může být speciální případ cltverce...
Obdélník nesplňuje shodnou délku stran čtverce, proto nejde o specializaci. Při specializaci obdélník -> čtverec jsou všechna pravidla zachována a jedno přibývá. Co je na tom nejasného?
Jak psal Satai Nekola, ctverec dedici z obdelnika je v pohode pouze, pokud je immutable, jinak porusuje Liskov Substitution Principle, tedy instance podtypu ma stejne
ocekavane vlastnosti jako instance nadtypu.
Kdyz budu mit mutable obdelnik s metodami setSideA a setSideB,
ocekavam, ze kdyz zavolam setSideA, strana B se nezmeni, to je, rekl bych, pomerne dost
ocekavana vlastnost. Jinak by treba neplatila posloupnost
b = obdelnik.obsah()/obdelnik.a()
obdelnik.setSideA(10)
obdelnik.obsah() == b * obdelnik.a()
coz muze prekvapit a potrapit.
No a kdyz z nej podedim ctverec, tam je zase
ocekavana vlastnost, ze delka A == delka B.
A ted co se ma stat, kdyz zavolam setSideA na ctverci jakozto potomku obdelnika? At vymyslis jakekoliv reseni, vzdy to bude z nektere strany davat
neocekavane chovani.
Pokud jsou obdelnik a ctverec immutable, timto neduhem netrpi (netvrdim nic o tom, co se
ocekava, ze se stane, kdyz zavolam setSideA, protoze zadna takova mutator metoda neexistuje).
Tohle si myslim je dost zakladni princip, ktery by kazdy programator v jazycich s subtype polymorfismem mel znat.