Co to jest dziedziczenie wielokrotne w Javie?

Programiści zaprojektowali Javę od początku jako kompletny i obiektowy język programowania.

OOP i dziedziczenie

Wykorzystanie programowania obiektowego wykorzystuje koncepcję dziedziczenia do rozszerzenia funkcjonalności obiektów. Pomyśl o tym, kiedy programista tworzy obiekt. Później widać, że trzeba stworzyć bardzo podobny obiekt z niewielkimi różnicami (być może rozszerzyć funkcjonalność wcześniejszego obiektu w nowym kontekście). Tutaj pojawia się dziedziczenie. Obiekt, który programista "wywodzi" z innego obiektu "podstawowego", dziedziczy metody i zmienne klasy, a następnie może dodać więcej funkcji (jak w następującym przykładzie Java):

klasa publiczna Sphere {public int radius; }

klasa publiczna Ball extends Sphere {public string color; // Ball dodaje zmienną "color", ale także używa zmiennej "radius"}

Wielokrotne dziedziczenie

W pewnym momencie programista może mieć pokusę wyprowadzenia jednej klasy z kilku klas. Jest to znane jako "dziedziczenie wielokrotne" i chociaż wydaje się użyteczne, może powodować problemy, takie jak ważny "problem z diamentem". Ten problem występuje, gdy dwie klasy dziedziczą z tej samej klasy (jako klasa B i C pochodzą z klasy A), podczas gdy inna klasa (D) pochodzi z B i C. Po utworzeniu obiektu D system traktuje go jako typ klasy bazowej (klasa "piłka" lub piłka i "kula" lub kula, na przykład). W przypadku problemu z diamentem, system nie może zdecydowanie określić, która klasa D (czy jest to typ ABD czy typ ACD?) Jest tym, który powoduje problemy.

Java i dziedziczenie wielokrotne

Z powodu problemów z dziedziczeniem wielokrotnym Java nie zezwala na to. Ale w rzeczywistości klasy wywodzące się z kilku klas bazowych można osiągnąć w bezpieczny sposób przy użyciu "interfejsów". Interfejs jest podobny do klasy, ale nie tylko definiuje strukturę klasy, ale także jej prawdziwy kod. Klasa podstawowa, która implementuje interfejs, niekoniecznie "dziedziczy" funkcjonalność interfejsu: obiecuje jedynie wykorzystanie jego struktury. Ponieważ klasa implementująca interfejs nie dziedziczy z innej klasy (i nie jest typem klasy bazowej), programista może implementować kilka interfejsów przy użyciu tej samej klasy.

Przykład: dziedziczenie i interfejsy

Poniższy przykład ilustruje różnicę między dziedziczeniem obiektów a interfejsem. Klasa dziedzicząca po innej uzyskuje dostęp do klasy bazowej, ponieważ w zasadzie staje się typem tej klasy (tak jak w klasach "Piłka" i "Sfera"). Klasa implementująca interfejs obiecuje jedynie implementację struktury interfejsu: nie jest typem tego interfejsu:

interfejs Basic {int doubleA (); // uwaga: w interfejsie nie ma prawdziwego kodu}

public class B implementuje Basic {

public int a;

public int doubleA () // klasa B musi zdefiniować metodę "doubleA ()" do implementacji "Basic" {return a * 2;}}