je to presne ako vravi predrecnik: ked mame elipsu, ta sa da natahovat v oboch osiach (= horizontalne i vertikalne cez setWidth() resp setHeight()). Zmena sirky neovplyvni zmenu vysky a naopak. Ta posledna veta definuje kontrakt, co je akasi "spolocenska zmluva", ktora sa dohodne medzi pouzivatelom triedy a samotnou triedou. Ak je kontrakt dodrzany, metoda dava spravne a ocakavane vysledky. Pre prekryte metody plati, ze musia dodrzat kontrakt rodicovskej metody (inak by to vracalo bludy).
A teraz zoberme kruznicu, co dedi od elipsy. Musi prekryt metody setWidth() aj setHeight(). Mame dve moznosti:
* bud so zmenou sirky sa musi menit aj vyska. To je porusenie kontraktu.
* alebo sa so zmenou sirky vyska nemeni, co sice dodrzi kontrakt rodicovskej metody, ale tym padom mame kruznicu, co zrazu prestane byt kruznicou ("zelipsovatie"), co je logicky blud (nechcete mat objekt typu Kruznica, ktory ma rozlicne polomery...)
jeden z principov prekryvania (override / dedenia) metod, je:
* predpodmienky (tvrdenia, ktore musia platit pred spustenim metody) nemozno v oddedenej metode pritvrdit. Ak pre elipsu plati, ze polosi mozu byt rozne, pre kruznicu nesmieme pred zmenou sirky vyzadovat, ze polosi (= polomer) musia byt rovnake
* postpodmienky (tvrdenia, ktore musia platit po dobehnuti metody) nemozno zoslabit. Ak pre elipsu plati, ze po zmene sirky sa vyska zachova, nemozeme v kruznici zrazu povedat, ze po zmene sirky sa moze zmenit vyska.
* invarianty (tvrdenia, ktore su nemenne pocas behu metody) sa nezmenia -- toto tu nema zmysel.
Cele to suvisi s Liskovovej substitucnym principom: co volne povedane hovori, ze ked mame v premennej typu elipsa nejaky objekt a nahradime ho napr. kruznicou, spravanie sa nezmeni. Je vidiet, ze to nie je pravda, lebo spravanie kruznice a elipsy su ine (staci si to predstavit na priklade vektoroveho editora a la Illustrator/Inkscape/Corel) a preto nema tam byt hierarchia dedicnosti, aj ked matematicka definicia hovori inak.
a ako hovori tiez predrecnik, cele je to o tom, ze trieda je navrhnuta ako premenliva (teda hodnoty jej instancnych premennych sa mozu menit), ale klasicky javoidny dizajn tried velmi neuvazuje o situaciach nemenlivych tried.