Voi ignora subiectul principal, dar ... mmm ...
evident ca moștenirea e un lucru rău.
In limbajul INTERCAL nu exista instructiunea rea GOTO; în schimb are instrucțiunea COME FROM. Ideea a fost importată în Python.
from goto import comefrom, label
comefrom .repeat
name = raw_input('what is your name? ')
if name:
print "Hello",name
label .repeat
print "Goodbye!"
Binențeles că e o glumă. Problema e că citești codul de pe lângă „label .repeat” și habar n-ai unde o să meargă mai departe programul decât dacă te uiți la un context destul de mare.
Moștenirea, mai exact polimorfismul de subtip, este
mai rău de atât. Dacă vezi un apel
x.foo() habar n-ai unde va merge execuția decât dacă știi care este tipul dinamic al lui
x. Asta nu poți face decât folosind un context mare
și ținând informații dependente de pe traiectoria execuției (flow-sensitive). Există tot felul de încercări de rezolvare a problemei.
Liskov a zis că trebuie să nu conteze care dintre
foo-uri e apelat. Cu alte cuvinte,
foo-urile trebuie scrise în așa fel încât să poți substitui un subtip fără nici o modificare observabilă pentru un utilizator care folosește ca tip static tipul de bază. Restricția asta însă este nerespectată în practică de multe ori, chiar și în APIuri considerate bune. De exemplu, metoda
equals în Java. (Nerespectarea principiului lui Liskov e una din explicațiile date de oameni pentru bug-urile nenumărate legate de equals și hashCode.)
Una dintre cele mai recente și complete explicații ale moștenirii este probabil
teza lui Parkinson. Înainte de asta polimorfismul de subtip a fost explicat cel mai bine de
Cardelli (
varianta 1984).
Polimorfismul parametric și polimorfismul ad-hoc
nu au problema asta. Cel parametric a fost explicat satisfăcător de
Reynolds (search keywords: „relational polymorphism”).
Înseamnă asta că nu mai trebuie folosim polimorfism de subtip? Nu: Înseamnă că trebuie să ne gândim cu atenție dacă chiar vrem să-l folosim, fiindcă e complicat și
va cauza probleme neașteptate. Cu alte cuvinte, îl folosim dacă avem motive bune, nu doar din inerție.