Problem Klassenvererbung

Status
Nicht offen für weitere Antworten.

wersi77

Aktives Mitglied
Hallo zusammen,

ich habe ein kleines Problem bzgl. Klassenvererbung:

Ich habe 4 Klassen, die teilweise gleiche Eigenschaften haben:


Eig.1 Eig.2 Eig.3
Klasse1 x x x
Klasse2 x x
Klasse3 x x
Klasse4 x


Dann würde ich eine abstrakte Oberklasse erstellen die erstmal grundsätzlich Eigenschaft 1 beinhaltet.
Aber was mache ich mit beispielsweise Klasse 2 und 3. Diese habe zwar beide die erste Eigenschaft, aber leider entweder E2 oder E3. Das wäre ja auch nicht so schlimm. Dann erben diese die Eigenschaften der Abtrakten Klasse und implementieren eigene Eigenschaften (E2 bzw. E3).
Jetzt hätte ich natürlich gerne Mehrfachvererbung für Klasse1, was bekanntlich nicht geht.
Was tun? Interfaces? Wie sollte man das dann aufbauen???
 

wersi77

Aktives Mitglied
Ich sehe gerade, das mein Diagramm schlecht gepostet wurde. Daher hier die Erklärung:
Klasse1 soll alle Eigenschaften haben.
Klasse2 kann E1 und E3
Klasse3 kann E1 und E2
Klasse4 kann nur E1

Ich hoffe, ihr versteht meine Problematik
 

Marco13

Top Contributor
Sehr theoretisch. Naheligeend wäre auf Basis dessen, was du geschrieben hast:
E4 gehört zu Klasse1 (und hat mit den anderen Klassen nichts zu tun)
E1 liegt in einer abstrakten Klasse, von der alle erben.
E2 und E3 sind interfaces, die jeweils von Klasse2 bzw Klasse3 implementiert werden
Klasse1 erbt E1, bietet E4 an, und implementiert E2 und E3....
Aber ohne die genauen Klassen zu kennen, ist das natürlich nur ein Tipp ins Blaue...
 

wersi77

Aktives Mitglied
Aber dann muss ich doch E2 und E3 in Klasse 1, 2 bzw. 3 implementieren. wozu dann Interfaces? Implementieren müsste ich sie doch sowieso, oder?
 

Marco13

Top Contributor
Damit man weiß, dass die Klassen die entsprechenden Eigenschaften haben. Dafür sind interfaces nunmal da... :roll:

interface E2 { void e2() }
interface E3 { void e3() }
class Klasse1 implements E2, E3 { void e2() {...} void e3() {...} }
class Klasse2 implements E2 { void e2() {...} }
class Klasse2ohneInterface { void e2() {...} }

ArrayList<E2> list = ...
list.add(new Klasse1()); // Geht: Klasse1 ist auch ein E2
list.add(new Klasse2()); // Geht: Klasse2 ist auch ein E2
list.add(new Klasse2ohneInterface()); // Geht NICHT: Klasse2ohneInterface bietet zwar e2 an, ist aber kein E2...
 
G

Gast

Gast
Vererbung ist nicht immer der Weisheit letzter Schluß

Wie wäre es mit Komposition

Es gibt eine KlasseA die E1 implementiert;

Es gibt eine KlasseB die E2 implementiert;

Es gibt eine KlasseC die E3 implementiert;

Alle 3 Implementieren das Interface I1;

Klasse2 und Klasse3 erben nicht von Klasse1 per Klassenvererbung!
Sie bekommen eine Instanz von I1 auf der sie die eigenschaft die sie auf ihrer superklasse aufrufen würden auf ihrem exemplar von I1 aufrufen.

Nun kann man eine Factory erstellen.
Die I1 liefert.
1. in der Implementierung KlasseA

2. in der Implementierung KlasseB der KlasseA übergeben wird

3. in der Implementierung KlasseC der KlasseA übergeben wird

4. in der Implementierung KlasseB der KlasseC übergeben wird,
bzw. KlasseC der KlasseB übergeben wird.


z.b.

Interface sei ein Telefongebührenzähler mit den Methoden start, stop, gebührAnzeigen.


Klasse A ist ein Zähler lediglich mit Minutenpreis

Klasse B sei ein Zähler mit einer Grundgebühr pro Abrechnungszeitraum

Klasse C sei einer mit einer Mindestgebührprogespräch

Klasse D wird von der Factory zusammengebaut und stellt einen mit minidestundgrundgebühr dar
 

ToKaM OnE

Aktives Mitglied
Wieso sollte er die Klasse mit E1 abstrakt machen?
Er will doch Objekte von Klasse 4 erzeugen, und man kann auch von nicht abstrakten Klassen erben.

Wenn du denkst, dass sich an Klasse 4 etwas ändern könnte, dass später nicht für Klasse 1 2 und 3 gelten soll, kapsel die gemeinsamkeit aller klassen in eine abstrakte klasse aus.


um was für eigenschaften handelt es sich da im groben?
eventuel fällt mir ja noch ein besserer entwurf dazu ein.

decorator oder composite muster ?!? Aber das kann man nicht generell sagen, es hängt von der beschafenheit deiner Eigenschaften ab. Ein Interface klingt nicht schlecht, damit schaffst du eine schnittstelle, für alle Klassen die die Eigenschaft haben, jedoch musst du wenn sich E2 ändert E2 in allen klassen, die E2 implementieren ändern.

Du solltest dir vorm Entwurf einer Anwendung überlegen was sich später an deinem code verändern kann, und das sollte ausgekapselt werden. Sagt sich allerdings leichter als es gemacht ist.

Angenommen E2 z.B. sei eine simple methode, die das Objekt nach einigen berechnungen über setter verändert, könntest du Eigenschaft2 auch in eine extra Klasse packen


Code:
public class Eigenschaft2 {
	public void exeute(E2 e){

	}
}
Code:
public interface E2 {
	public static Eigenschaft2 eigenschaft2 = new Eigenschaft2();
	/**
	 * sollte e2.execute(E2 e) aufrufen
	 *
	 */
	public void fuehreEigenschaft2Aus();
}
Code:
public class K4 {
	
}
Code:
public class K2 extends K4 implements E2{
	public void fuehreEigenschaft2Aus() {
		E2.eigenschaft2.exeute(this);
		
	}
}

PS: ich bin auch noch beginner, und stelle hiermit meinen vorschalg und meine antwort zur diskussion. :D
Meiner Ansicht nach müsste man mehr über die Eigenschaften der Klasse wissen um sich einen Entwurf überlegen zu können.
Meine Obrige idee hätte den Vorteil, dass wenn sich e2 ändert, er e2 nicht in jeder klasse ändern muss, sondern nur einmal global, ist aber sich nicht "die" prefekte lößung.

Mfg tokam
 

ToKaM OnE

Aktives Mitglied
@ gast:

was wäre, wenn e1 e2 und e3 völlig verschiedene eigenschaften sind, die nichts miteinander zu tun haben?
Bei deinem Entwurf kann er doch nur eine referenz auf eine eigenschaft des typs i1 halten und nur die methoden einer eigenschaft aufrufen?

Angenommen kelnerin 4 hat die eigenschaft bedienen
kellnerin 2 hat die eigenschaft bedienen und kassieren
kellnerin 3 kann bedienen und kochen
und k4 kann alles 3.

sollen k2 und k3 nun eine referenz auf ein objekts des datentyps interface1 halten, dass die methoden kochen, bedienen und kassieren vorgibt?

was bringt dir die factory?

abstract factory oder factory method?
 

wersi77

Aktives Mitglied
Es handelt sich dabei beispielsweise um schlichte Eigenschaften, wie:

String name;
String autogeschwindigkeit;
String flugzeughoehe;

Wenn man das auf Mobile umsetzt und dann Auto (Kl.2) und Flugzeug (Kl.3) und Strassenbahn (Kl.4) ableitet.

Hintergrund ist, dass ich die Tables in einer Datenbank als Klassen darstellen will. Dabei haben die Tables oftmals gleiche Spaltennamen, die ich gerne abstrahieren würde in eine TablesMain-Klasse.
 

wersi77

Aktives Mitglied
Streng genommen heisst das, dass es viele autoeigenschaften gibt und viele flugzeugeigenschaften und viele namenseigenschaften, welche man gut abstrahieren kann.

Muss ich bei den Autos und den Flugzeugen nun in den sauren Apfel beissen und für jedes Auto und jedes Flugzeug die einzelnen Eigenschaften implementieren? Wäre bei vielen Autos und Flugzeugen sehr blöd, oder?
 

Marco13

Top Contributor
Tja. Natürlich gibt es verschiedene Möglichkeiten. Aber keiner weiß so ganu, worum es geht, wie du, deswegen kann niemand entscheiden, welche die beste Lösung ist. Das mit den Interfaces war eine Möglichkeit, aber es kann sein, dass in diesem Fall (wie Gast gesagt hat) Komposition bzw. Delegation eine bessere Lösung wäre. Wer weiß.
 
M

maki

Gast
@wersi77

Muss ich bei den Autos und den Flugzeugen nun in den sauren Apfel beissen und für jedes Auto und jedes Flugzeug die einzelnen Eigenschaften implementieren? Wäre bei vielen Autos und Flugzeugen sehr blöd, oder?
Vererbung ist nicht dafür da, um weniger code schreiben zu müssen.
Vererbung wird benutzt, um etwas auszudrücken.
Wenn eine Klasse von einer anderen Klasse erbt, dann ist das eine "Ist ein" Beziehung.
Mit Interfaces kann man auszudrücken, das eine Klasse etwas kann. Man fügt also Funktionalität hinzu, ohne dabei zu ändern, was die Klasse "ist".

Du könntest ein gemeinsames Interface erstellen, dieses dann in 2 abstrakten Klassen (teilweise) implementieren, einmal für Auto und einmal für Flugzeuge.
Oder du machst eine abstrakte Klasse, welche das Interface (teilweise) impementiert, und erbst dann in 2 abstrakten Klassen davon, einmal für Auto und einmal für Flugzeug.
Sieh dir doch mal die Collections API an, alles nur Interfaces
;)

@ToKaM OnE, da hast du ein paar Dinge durcheinander geworfen ;)
 

wersi77

Aktives Mitglied
Gibt es eine beispielhafte Implementierung für Komposition?
Dann kann ich es mir besser vorstellen...
 
G

Gast

Gast
@ToKam OnE
Code:
interface i1{
arbeiten()
}
Klasse1 implements i1{
arbeiten(){
ichBediene;
}
}
Klasse2 implements i1{
i1 = Klasse1 //Klasse1 wird zur Laufzeit übergeben, am besten per Factory
arbeiten(){
i1.arbeiten();
ichKassiere;
}
}
Klasse3 implements i1{
i1=Klasse1 //Klasse1 wird zur Laufzeit übergeben, am besten per Factory
arbeiten(){
i1.arbeiten();
ichKoche;
}
}

//Klassse4 gibts nicht!
//Die Factory erstellt dir stattdessen
return new Klasse3(new Klasse2(new Klasse1));

so kann man sich das etwa vorstellen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
J Problem bei Umrechnung von Hex in Bin Java Basics - Anfänger-Themen 4
W Problem bei Programmierung von Monte-Carlo-Integration Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben