OOP: Überschreiben/Implementierung von Methoden

automatix

Aktives Mitglied
Hallo zusammen!

Das Thema ist sogar etwas allgemeiner, als eine "allgemeines Java-Thema" -- es geht um das Überschreiben / die Implementierung von Methoden generell.

Es gibt zunächst zwei Klassen ClassA und ClassB (ClassB erbt von ClassA). Weiterhin gibt es zwei andere Klassen ClassX und ClassY (ClassY erbt von ClassX). Die Klasse ClassA ist abstrakt und definiert eine abstrakte Methode method(ClassX objectX). Die Klasse ClassB muss sie implementieren. Also, eigentlich überschreiben: method(ClassX objectX).

Das Problem ist, dass die Methode method(...) der konkreten implementierenden Klasse ClassB eigentich nicht ein Objekt vom Typ ClassX, sondern nur eins vom Typ ClassY sinnvoll verarbeiten kann.

Beispliel:
ClassX ist eine allgemeine Tabellenklasse.
ClassY ist eine Klasse, die eine konkrete Tabelle "bücher" darstellt und dementsprechend Zugriffsmethoden für die spezifischen Attribute "titel", "autor" und "anzahlSeiten" hat.
ClassZ (extends ClassX) ist eine Klasse, die eine konkrete Tabelle "räume" darstellt und dementsprechend Zugriffsmethoden für die spezifischen Attribute "raumNr", und "gebäude" hat.

Wie würdet Ihr das Problem lösen?

Danke
 
Also, eigentlich überschreiben: method(ClassX objectX).

Würd ich nicht sagen, ClassB muss ClassA implementieren, es gibt ja keinen Methoden- Rumpf in ClassA.
Schau dir mal das Liskovsche Substitutions- Prinzip an (Liskovsches Substitutionsprinzip ? Wikipedia).

Ich würde eine Klasse, welche 3 Dimensionen darstellen soll, auch nicht von einer Klasse ableiten, welche 2 Dimensionen darstellt -> da würd ich mir das Ableiten sparen.

Generell: wenns nach dem Ableiten undurchschaubarer/komplizierter/aufwendiger wird also ohne ableiten, dann sollst du nicht ableiten.
Statt dem Ableiten kann man auch noch das Decorer- Pattern verwenden - ist manchmal besser.
 
Zuletzt bearbeitet:
@MQue
Danke für Deine Antwort und speziell für die Hinweise auf das Liskovsche Substitutionsprinzip und das Decorator-Entwurfsmuster.

Würdest Du dich also im Beispiel mit den Tabellen des Decorator-Patterns bedienen?
 
JA, würd ich machen, da hast du eine Referenz auf ein Objekt einer anderen Tabelle und kannst aufrufen was du willst/bzw. was du brauchst.

Mit der Vererbung erbst du alles von der Basisklasse, auch das was nicht gebracuht wird, das wird dann oft sehr verwirrend, umständlich und im OO- Sinne falsch.
 
Ja genau, das sind Generics, Ich würde an deiner Stelle statt:

Java:
ClassB objectB = new ClassB();
ClassY objectY = new ClassY();

->

Java:
ClassA objectB = new ClassB();
ClassX objectY = new ClassY();


Immer den Typ der Basisklasse verwenden, mit der dein Programm noch funktioniert.
 

Neue Themen


Zurück
Oben