Moștenirea diamantelor

Moștenirea diamantului este o situație  în limbajele de programare orientate pe obiecte cu suport pentru moștenirea multiplă , când două clase și moștenesc de la , iar o clasă moștenește de la ambele clase și . Cu această schemă de moștenire, poate apărea ambiguitatea: dacă un obiect de clasă apelează o metodă definită în clasă (și această metodă nu a fost suprascrisă în clasă ), iar clasele suprascriu această metodă în felul lor, atunci din ce clasă ar trebui să fie moștenit: sau ? BC ADBCDADBCBC

De exemplu, în domeniul dezvoltării interfeței grafice , o clasă Button(„Button”) poate moșteni simultan dintr-o clasă Rectangle(„Dreptunghi”, pentru aspect) și dintr-o clasă Clickable(„Disponibil pentru clicuri de mouse”, pentru implementarea funcționalității/prelucrarea intrărilor). ), Rectangleși Clickablemoștenesc din clasă Object("Obiect"). Dacă apelați metoda equals(“Egal cu”) pe obiect Button, iar clasa Buttonnu are o astfel de metodă, dar clasa Objectare o metodă equalssuprascrisă în felul său atât în ​​clasă, cât Rectangleși în Clickable, atunci care metodă ar trebui apelată?

Problema diamantului și-a primit numele de la forma diagramei de moștenire de clasă în această situație .  În acest articol, clasa este desemnată în partea de sus, clasele și sunt enumerate individual mai jos și conectate la ambele în partea de jos, formând un romb . ABCD

Hotărâri

Diverse limbaje de programare rezolvă problema moștenirii diamantelor în următoarele moduri:

Alte exemple

Limbajele care permit doar moștenirea simplă (cum ar fi Ada , Objective-C , PHP , C# , Delphi / Free Pascal și Java ) asigură moștenirea multiplă a interfețelor (numite protocoale în Objective-C). Interfețele sunt în esență clase de bază abstracte, toate metodele fiind, de asemenea, abstracte și în care nu există câmpuri. Astfel, problema nu se pune, deoarece va exista întotdeauna o singură implementare a unei anumite metode sau proprietăți, fără a permite ambiguitatea să apară.

Problema diamantelor nu se limitează la moștenire. De asemenea, apare în limbaje precum C și C++ atunci când fișierele de antet A, B, C și D, precum și anteturile separate precompilate create din B și C, sunt conectate (folosind instrucțiunile #include) unul la altul în modelul romboidale. prezentat mai sus.. Dacă aceste două anteturi precompilate sunt combinate, declarațiile din A sunt duplicate și directiva de protecție a conexiunii #ifndef devine ineficientă. De asemenea, problema se găsește la îmbinarea stivelor de subrutine ; de exemplu, dacă A este o bază de date și B și C sunt cache , atunci D poate cere atât B cât și C să comite ( COMMIT ) tranzacția, rezultând apeluri de confirmare duplicate către A.

Note

  1. Ordinul de rezoluție a metodei Python 2.3  . Consultat la 15 mai 2010. Arhivat din original la 12 aprilie 2012.

Literatură