Was nutzen statt Mehrfachvererbung?

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi!
ja, ich weiss Java hat keine Mehrfachvererbung und ich weiss auch, dass man statt dessen Interfaces nehmen soll, aber da die ja nunmal keine Implementierung enthalten dürfen sind die nicht das, was ich brauche...
Ich beschreibe euch mal was ich hab und wie ich's lös und wenn jemand vorschläge hat wie's eleganter geht, immer her damit

Nicht wirklich veränderbare Vorgabe:
Code:
public abstract class a extends irgendwas{

   protected abstract void x();

   public void y() {
      x();
   }

   public void z() {
      y();
   }
}


public class i1 extends a {

   protected void x(){
       ...
   }

}

 [...]

public class i9 extends a {

   protected void x(){
       ...
   }

}


Jetzt brauche ich eigentlich Klassen d1 bis d9, die genauso arbeiten wie i1 bis i9, aber bei denen y() anders implementiert ist...

Momentan ist das bei mir so:
Code:
public class d1 extends i1 {

   protected void y(){
       ...
   }

}

 [...]

public class d9 extends i9 {

   protected void y(){
       ...
   }

}

Das geht so, aber ist halt eigentlich unschön, weil ich jetzt 9 mal den selben code hab, bei dem sich nur das extends unterscheidet... Also vielelicht sollte ich nochmal explizit sagen, die x() arbeiten alle unterschiedlich, aber die neuen y() sind alle gleich...

BTW sorry für die Namen, beim Versuch, euch die wirren Klassennamen und so zu ersparen hab ich glaub ich was genauso wirres erzeugt...

Danke an jeden der sich die Mühe gemacht hat das zu lesen 🙂
Jan
 
Wenn du das größere Konzept beschreibst anstatt nur deinen bisherigen Lösungsansatz, dann findet sich vielleicht eine elegantere Lösung. Nebenbei bemerkt: Interfaces sind kein Ersatz für Mehrfachvererbung, es handelt sich um Mehrfachvererbung (nur keine Mehrfachvererbung von Implementierungen)
 
Kannst auch eine abstrakte Klasse schreiben, welche die Methode des Interfaces implementiert, die (fast) gleich ist.
 
Interfaces sind schon ein Ersatz für Mehrfachvererbung, da man dadurch einer Klasse eine Menge verschiedener Methoden vorgeben kann, die aus zwei oder mehr Interfaces stammen.

Die Implementierung dieser Methoden kann man dann z.B. durch Delegates lösen, d.h. anstatt jedes Mal die Methoden neu zu implementieren, schreibt man eine Klasse, die die Implementierung dieser Methoden erledigt, und die Interface-Methoden verweisen dann immer auf das Delegate.
 
Okay, meine Formulierung war vielleicht schlecht... Bitte nicht weiter streiten ob das ein Ersatz ist oder the real thing...

Okay, das grössere Konzept... Hm, ich soll eine Erweiterung für ein bestehendes Programm schreiben, die dafür sorgt, dass bestimmte Methoden nicht lokal arbeiten sondern rechenaufwendige Aufgaben übers Netzwerk an andere Rechner schicken...
Dabei ist mir halt aufgefallen, dass mehrere von den Klassen extrem ähnlich sind...
Naja, und die einzige öffentliche Methode entsteht irgendwo weiter oben in der Vererbungskette und stösst mehrere private Sachen an die an unterschiedlichen Stellen der Kette dazu kommen...
Und eine davon muss ich verändern, damit der Daten verschickt...
Naja, da die einzelnen Klassen an sich so arbeiten müssen wie die originale, sollten die halt von den originalen erben, aber alle ein paar der geerbten Methoden verändern...

Am schönsten wäre es natürlich, einfach in die Kette rein zu greifen und die eine Methode zu ändern, aber dann geht das halt nicht mehr so wie vorher und dass soll bestehen bleiben...
 
Am Rande des Geländers: "Echte" Mehrfachvererbnung sorgt für mehr Probleme als Lösungen, es war Absicht keine Mehrfachvererbung für Implementierungen zuzulassen.

Vielleciht ist ja das Strategy Pattern einen Blick wert?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben