Nez sa rozhodnem, ci je nieco trieda alebo rozhranie, polozim si presne tuto otazku, aky typ vztahu to reprezentuje. Ak by som si tuto otazku nepolozil, lahko dospejem k zlemu navrhu, kde holub aj lietadlo priamociaro dedia od nejakeho spolocneho predka - triedy. Dosledkom bude, ze sa stratim pri rozsirovani programu, ked sa budem stale budem borit s problemom, ze tie 2 veci vlastne nemaju nic spolocne, len v nejakej casti programu potrebujem vediet, ze oboje vedia lietat a vykonat s nimi nejaku "lietajucu" operaciu.
To je sice hezká teorie, ale imho je to přesná ukázka přecenění OOP - představy, že "osekané" OOP je způsob myšlení, ktrerý je "přirozeným" základem jakýchkoli vztahů, abstrakcí.
Především to takhle těžko můžeš říct u jazyků, které nemají vícenásobnou dědičnost, protože jeden objekt samozřejmě může spadat do víc tříd, protože třída není nic jiného než abstraktní pojem, kterým pojmenováváme konkrétní objekty, které mají nějaké konkrétní vlastnosti. Neexistuje nic jako "přirozená kmenová třída", což by byla abstraktní skupina, do které objekt patří "primárně" a která by tak byla jediným "správným" předkem všech objektů libovolné třídy X.
Např. ropa je (is-a) stejně tak "mazlavá tekutina" jako "palivo" a "organická sloučenina". Jazyk bez vícenásobné dědičnosti mě donutí k tomu, že budu tvrdit, že ropa je (is-a) primárně "organická sloučenina" plus má vlastnosti (can-do) paliva a mazlavé tekutiny, což zjevně neodpovídá skutečnosti, protože to můžu klidně udělat opačně (is-a palivo, can-do mazlavá).
Tomu, jak normálně pojmy používáme, by bylo imho daleko bližší používat interfejsy (klidně uspořádané do hierarchie, když už to teda chceme) plus mixiny, které ty interfejsy implementují, protože když už nějak formalizovat naše vnímání/myšlení, tak tak, že máme nějaké objekty, které mají nějaké (víceméně volně kombinovatelné) vlastnosti. Bohužel běžný programátor používá dědění na úkor skládání, což je imho opět neblahý vliv C++, ze kterého se ani Java pořádně nevymanila.