Ist es möglich, die Vererbung der Implementierung vollständig zu vermeiden?

Ich werde Java als Beispiel wählen, die meisten Leute kennen es, obwohl auch jede andere OO-Sprache funktioniert hat.

Java verfügt wie viele andere Sprachen über Schnittstellen- und Implementierungsvererbung. Z.B. Eine Java-Klasse kann von einer anderen Klasse erben, und jede Methode, die dort implementiert ist (vorausgesetzt, die übergeordnete Klasse ist nicht abstrakt), wird ebenfalls geerbt. Das heißt, die Schnittstelle wird vererbt und die Implementierung auch für diese Methode. Ich kann es überschreiben, muss es aber nicht. Wenn ich es nicht überschreibe, habe ich die Implementierung geerbt.

Meine Klasse kann jedoch auch nur eine Schnittstelle "erben" (nicht in Java), ohne sie zu implementieren. Tatsächlich werden Interfaces in Java so benannt, sie bieten eine Schnittstellenvererbung, jedoch ohne eine Implementierung zu erben, da alle Methoden einer Schnittstelle keine Implementierung haben.

Nun war da dasIn diesem Artikel heißt es, es sei besser, Schnittstellen als Implementierungen zu erbenVielleicht möchten Sie es lesen (mindestens die erste Hälfte der ersten Seite), es ist ziemlich interessant. Es vermeidet Probleme wie diefragile Basisklasse Problem. Bisher macht das alles sehr viel Sinn und viele andere Dinge, die in dem Artikel gesagt werden, sind für mich sehr sinnvoll.

Was mich daran stört, ist, dass Implementierungsvererbung bedeutetWiederverwendung von Code, eine der wichtigsten Eigenschaften von OO-Sprachen. Wenn Java keine Klassen hätte (wie James Gosling, der Pate von Java, es sich gemäß diesem Artikel gewünscht hat), löst es alle Probleme der Implementierungsvererbung. Aber wie würden Sie dann die Wiederverwendung von Code ermöglichen?

Z.B. Wenn ich eine Klasse Auto habe und Auto über eine Methode move () verfügt, bewegt sich das Auto. Jetzt kann ich ein Auto für verschiedene Arten von Autos unterteilen, die alle Autos sind, aber alle spezialisierten Versionen von Car. Einige bewegen sich möglicherweise anders, diese müssen jedoch trotzdem move () überschreiben, aber die meisten behalten einfach den geerbten Zug bei, da sie sich genauso bewegen wie das abstrakte übergeordnete Auto. Nehmen wir nun für eine Sekunde an, dass es in Java nur Interfaces gibt, nur Interfaces voneinander erben dürfen, eine Klasse Interfaces implementieren darf, aber alle Klassen immer final sind, so dass keine Klasse von einer anderen Klasse erben kann.

Wie können Sie vermeiden, dass Sie bei einem Interface Car und hundert Car-Klassen für jede eine identische move () -Methode implementieren müssen? Welche anderen Konzepte für die Wiederverwendung von Code als die Vererbung von Implementierungen gibt es in der OO-Welt?

Einige Sprachen haben Mixins. Sind Mixins die Antwort auf meine Frage? Ich habe darüber gelesen, kann mir aber nicht wirklich vorstellen, wie Mixins in einer Java-Welt funktionieren würden und ob sie das Problem hier wirklich lösen können.

Eine andere Idee war, dass es eine Klasse gibt, die nur die Car-Schnittstelle implementiert. Nennen wir sie AbstractCar und implementieren die move () -Methode. Jetzt implementieren auch andere Autos die Car-Schnittstelle. Intern erstellen sie eine Instanz von AbstractCar und implementieren ihre eigene move () -Methode, indem sie move () für ihr internes abstraktes Auto aufrufen. Aber wäre dies nicht eine Verschwendung von Ressourcen für nichts (eine Methode, die nur eine andere Methode aufruft - okay, JIT könnte den Code einbetten, aber immer noch) und die Verwendung von zusätzlichem Speicher für die Aufbewahrung interner Objekte, die Sie bei der Vererbung der Implementierung nicht einmal benötigen würden? (Schließlich benötigt jedes Objekt mehr Speicher als nur die Summe der eingekapselten Daten.) Auch ist es für einen Programmierer nicht umständlich, Dummy-Methoden wie diese zu schreiben

public void move() {
    abstractCarObject.move();
}

?

Kann sich jemand eine bessere Idee vorstellen, wie man die Vererbung der Implementierung vermeidet und trotzdem Code auf einfache Weise wiederverwenden kann?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage