Care este moștenirea multiplă în Java?
POR și moștenire
Utilizarea programării orientate pe obiecte folosește conceptul de moștenire pentru a extinde funcționalitatea obiectelor. Gândiți-vă când un programator creează un obiect. Mai târziu, puteți vedea că trebuie să creați un obiect foarte asemănător, cu doar mici diferențe (poate extinde funcționalitatea unui obiect anterior într-un context nou). Aici apare moștenirea. Un obiect pe care un programator "derivă" dintr-un alt obiect "bază" moștenește metodele și variabilele clasei și poate adăuga mai multe funcționalități (ca în exemplul Java următor):
clasa publica publica {public radius int; }
clasa publică Ball extinde Sphere {culoare șir public; // Ball adaugă variabila "color", dar utilizează și variabila "radius"}
Moștenire multiplă
La un moment dat, un programator poate fi tentat să obțină o singură clasă de mai multe clase. Aceasta este cunoscută sub numele de "moștenire multiplă" și, deși pare utilă, poate provoca probleme, cum ar fi "problema diamant" importantă. Această problemă apare atunci când două clase moștenesc din aceeași clasă (ca și clasele B și C derivă din clasa A), în timp ce o altă clasă (D) derivă din B și C. Când un obiect D este creat, sistemul îl tratează ca un tip de clasă de bază (clasa "Ball" sau minge și "sferă" sau sferă, de exemplu). În problema diamantului, sistemul nu poate determina în mod decisiv ce clasă D (este tipul ABD sau tipul ACD?) Este cea care cauzează probleme.
Java și moștenire multiplă
Din cauza problemelor cu moștenire multiplă, Java nu o permite. Dar, în realitate, clasele derivate din mai multe clase de bază pot fi realizate într-un mod sigur folosind "interfețe". O interfață este similară unei clase, dar nu numai definește structura clasei, ci și codul său real. O clasă de bază care implementează o interfață nu neapărat "moșteneste" funcționalitatea interfeței: promite doar utilizarea structurii sale. Deoarece o clasă care implementează o interfață nu moșteneste dintr-o altă clasă (și nu este un tip de clasă de bază), un programator poate implementa mai multe interfețe folosind aceeași clasă.
Exemplu: moștenire și interfețe
Următorul exemplu prezintă diferența dintre moștenirea obiectelor și o interfață. O clasă care moștenește de la un altul are acces la clasa de bază, deoarece în principiu devine un tip de clasă (ca în clasele "Ball" și "Sphere"). O clasă care implementează o interfață doar promite să implementeze structura interfeței sale: nu este un tip de interfață:
interfață de bază {int doubleA (); // notă: în interfață nu este definit niciun cod real}
clasa publică B implementează {
public int;
public int doubleA () // clasa B trebuie să definească metoda "doubleA ()" pentru a implementa "Basic" {return a * 2;}}