Какво е много наследство в Java?
ОПО и наследство
Използването на обектно-ориентирано програмиране използва концепцията за наследяване, за да разшири функционалността на обектите. Помислете кога програмист създава обект. По-късно можете да видите, че трябва да създадете много подобен обект само с малки разлики (може би да разширите функционалността на по-ранен обект в нов контекст). Тук се появява наследството. Обектът, който програмистът "получава" от друг "базов" обект наследява методите и променливите на класа и след това може да добави още функционалност (както в следващия Java пример):
публична класа Сфера {public int radius; }
публичен клас Ball разширява сфера {public string color; // Точката добавя променливата "цвят", но също така използва променливата "радиус"}
Множество наследство
В един момент програмист може да се изкуши да извлече един клас от няколко класа. Това е известно като "многократно наследяване" и въпреки че изглежда полезно, то може да причини проблеми, като важния "диамантен проблем". Този проблем възниква, когато два класа наследяват от един и същи клас (като клас B и C произхождат от клас A), докато друг клас (D) произлиза от B и C. Когато D е създаден, системата го третира като тип базов клас (клас "топка" или топка и "сфера" или сфера, например). При проблема с диамантите системата не може да определи решително кой клас D (това е тип ABD или тип ACD?). Това е причината за проблемите.
Java и множествено наследство
Поради проблеми с множественото наследяване Java не го позволява. Но в действителност класове, получени от няколко базови класа, могат да бъдат постигнати по сигурен начин, като се използват "интерфейси". Интерфейсът е подобен на класа, но не само определя структурата на класа, но и реалния му код. Базовият клас, който изпълнява интерфейс, не непременно "наследява" функционалността на интерфейса: само обещава използването на неговата структура. Тъй като клас, който изпълнява интерфейс, не наследява от друг клас (и не е от типа на базовия клас), програмистът може да реализира няколко интерфейса, използващи един и същи клас.
Пример: наследство и интерфейси
Следният пример показва разликата между наследяването на обекти и интерфейс. Клас, който наследява от друг, получава достъп до базовия клас, защото основно се превръща в тип от този клас (както в класовете "Ball" и "Sphere"). Един клас, който изпълнява интерфейс, само обещава да внедри структурата на своя интерфейс: той не е типът на този интерфейс:
интерфейс Основен {int doubleA (); // Забележка: в интерфейса не е дефиниран реален код}
публичен клас B изпълнява Basic {
public int a;
публичен int doubleA () // клас B трябва да дефинира метода "doubleA ()", за да приложи "Basic" {return a * 2;}}