Erbe von allen Kindern

melmager

Erfahrenes Mitglied
etwas Hintergund https://www.tutorials.de/threads/projekt-lernsoftware-fuer-keyboard-musik.403666/

gegeben ist eine basisklasse
Code:
public abstract class Part implements Comparable<Part> { ... }

davon werden classen abgeleitet die natürlich die Basisklasse unterscheidlich erweitern
Code:
public class Clef extends Part {}
//oder
public class Note extends Part {}

jetzt brauche ich eine Class die mit allen bekannten Kindern umgehen kann.
derzeitige Version
Code:
public class Surface {
Part part;
// ich kann hier alle versionen der abkömmlinge
}

so geht es natürlich :)
jetzt frage ich mich wie ich es hinbekomme das Surface auch eine abgleitete Version ist.

Code:
Part s,n,c;
n = new Note();
c = new Clef();

// und dann geht ja
s = n;
s = c;

nur wie kann ich in s ermitteln das die Werte ursprünglich von Note Class oder Clef class gekommen sind ?

kann man im Konstuktor der class Surface mit "instanceof" arbeiten - oder wie bekommt man das sonst hin ?

Code:
public class Surface extends Part {
enum Quelle {
NOTE, CLEF;
}

Quelle quelle;
 
Surface(Part ursprung) {
  if (ursprung instanceof Clef) {
    quelle = Quelle.CLEF;
  }
}
}

// und dann sowas
s = new Surface(n);

die richtung ?
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
Wenn ich sowas vor hätte, dann würde ich es vermutlich so ähnlich machen wie du, allerdings würde ich die Unterscheidung (in erster Linie aus Wartungsgründen) im Enum selbst vornehmen. So werden ungültige Instanzen sofort angezeigt.

Ohne zu wissen, was du jedoch damit vorhast, wirkt es im Großen und Ganzen jedoch wie einmal ums Haus von hinten ins Auge. Es signalisiert, dass du im Surface je nach 'Quelle' wieder etwas anderes mit deinen Klassen vorhast. Das ist im Prinzip ja auch gut, dafür ist Vererbung ja auch da. Aber der richtige Weg wäre hier 'Part' eine abstracte Methode doSomething() zu geben, diese je Kind auszuprogrammieren und im Surface ursprung.doSomething() aufzurufen.

Wie gesagt, ich weiß nicht, was genau du damit bezwecken willst, aber es macht rein stilistisch für mich absolut keinen Sinn. Vielleicht magst du dein Ziel genauer erläutern?
 
Zuletzt bearbeitet: