Name der Parent Klasse abfragen

prototype0815

Aktives Mitglied
Hallo Leute,

ich habe mal eine etwas spezielle frage die ich nach einer Stunde recherche nicht lösen kann, und dringend brauche.

Ich habe 3 Klassen (A, B, C)

Ich befinde mich in Klasse A und erstelle ein Objekt der Klasse C
Ich befinde mich nun in Klasse B und erstelle ebenfalls ein Objekt der Klasse C


Nun befinde ich mich in Klasse C und programmiere meinen Code. Nun sollte ich wissen ob dieses Objekt von Klasse A oder Klasse B erstellt wurde, weil mein Programm anders reagieren soll.
Bsp.
Java:
if(parentKlasse == A) {
mach was;
}
else if(parentKlasse == B) {
mach was anderes;
}

wie kann ich nun abfragen wer in dieser Situation meine "erstellende" Klasse war?

LG proto
 
Ich habe 3 Klassen (A, B, C)

Ich befinde mich in Klasse A und erstelle ein Objekt der Klasse C
Ich befinde mich nun in Klasse B und erstelle ebenfalls ein Objekt der Klasse C

Nun befinde ich mich in Klasse C und programmiere meinen Code. Nun sollte ich wissen ob dieses Objekt von Klasse A oder Klasse B erstellt wurde, weil mein Programm anders reagieren soll.
Bsp.
Java:
if(parentKlasse == A) {
mach was;
}
else if(parentKlasse == B) {
mach was anderes;
}

Das hört sich so eigenartig an wie es auch ausschaut. Theoretisch könntest du den Konstruktor den Typ der erstellenden Klasse mitgeben (Klasse Class).


Einfacher wäre es wenn du ein Klasse Ca erstellst und Klasse A erstellt eben ein Objekt von Ca (analog dazu Cb, B erstellt ein Objekt von Cb). Wenn du bei Ca und Cb gemeinsamkeiten hat dann leite doch beide von einer Superklasse C ab.

Java:
public abstract class C {
}

public class CA extends C {
}

public class CB extends C {
}

public class A {
 private CA obj;
 public A() {
  obj = new CA();
 }
}

public class B {
 private CB obj;
 public B() {
  obj = new CB();
 }
}
 
Zuletzt bearbeitet:
da mir wirklich nichts besseres eingefallen ist habe ich es nun so gelöst...

ich habe in Klasse C, 2 Konstruktoren gebaut und mit Übergabeparametern gearbeitet.

Java:
public class KlasseC extends JPanel {


	public KlasseC() {
		this(-1);
	}
	
	public KlasseC(int Index) {
		
		if(index == -1) {
			mach das...
		}
		else {
			mach was anderes...
		}
	}


}

wird ein Objekt der Klasse "KlasseC" erstellt ohne Übergabeparameter, wird intern automatisch der zweite Konstruktor aufgerufen mit dem Übergabeparameter -1 .

wird ein Objekt der Klasse "KlasseC" erstellt mit Übergabeparameter, dann wird gleich der zweite Konstruktor angesprochen.

Und je nachdem wie das Objekt erstellt wird, mit oder ohne Übergabeparameter, wird ein anderer Konstruktor und somit auch anderer Code ausgeführt. und ich habe innerhalb der Klasse "KlasseC" nur minimale Änderungen.
 
getClass(); liefert dir den den laufzeittyp der Klasse

prüfen kannst du sowas z.B mit

Java:
if(this instanceof B){
  // do something
}

jetzt mal nur rein als fiktives beispiel..

Ansonsten kannst du sowas über Reflections ermöglichen, wenn die Superklasse dir unbekannt ist.
 
Zuletzt bearbeitet:
da mir wirklich nichts besseres eingefallen ist habe ich es nun so gelöst...

ich habe in Klasse C, 2 Konstruktoren gebaut und mit Übergabeparametern gearbeitet.

Java:
public class KlasseC extends JPanel {


	public KlasseC() {
		this(-1);
	}
	
	public KlasseC(int Index) {
		
		if(index == -1) {
			mach das...
		}
		else {
			mach was anderes...
		}
	}


}

wird ein Objekt der Klasse "KlasseC" erstellt ohne Übergabeparameter, wird intern automatisch der zweite Konstruktor aufgerufen mit dem Übergabeparameter -1 .

wird ein Objekt der Klasse "KlasseC" erstellt mit Übergabeparameter, dann wird gleich der zweite Konstruktor angesprochen.

Und je nachdem wie das Objekt erstellt wird, mit oder ohne Übergabeparameter, wird ein anderer Konstruktor und somit auch anderer Code ausgeführt. und ich habe innerhalb der Klasse "KlasseC" nur minimale Änderungen.
Ich denke du programmiert da ein wenig an der Idee von OOP vorbei. Eine Klasse sollte EIN Verhalten haben. Wenn du unterschiedliches Verhalten benötigst, dann mach eine zweite Klasse, die von der ersten erbt (oder die beide von einer Superklasse erben, wie Joose es beschrieben hat).

Denn die -1 ist dann einfach nur ne Magic-Number. Was passiert bei 0, -5 oder 4711? (Schon klar das du weißt was dann passiert, aber ich denke ein int (das auch noch so einen nichtssagenden namen wie "flag" trägt) wird die oder anderen in Zukunft nicht helfen deinen Code (wieder) zu verstehen.

Wenn schon per Übergabewert im Konstruktor, dann nimm ein boolean und gib den Parameter einen namen, der aussagt was mit diesem boolean gesteuert wird.

Aber so schreibst du einfach nur kryptischen Code, den aus dir keiner lesen kann. Und du selbst in 2 Monaten auch nicht mehr.
 
da hast du natürlich recht, boolean wäre schon toller aber ich brauche den int Index weil der sich ja natürlich auch ändert. Normalerweise ist die Klasse so gestaltet das sie Daten von einem Shared-Memory eines Echtzeitprogramms abfragt, ich musste sie nun so umbauen das sie Daten von wo anders bezieht und dafür brauche ich einen History-Index, aber das nur wenn sie als Objekt unterhalb der History Klasse eingebaut wird.

und das war das knifflige dabei... Natürlich hätte ich nun ganz schön eine Klasse erstellen und von dieser erben können, aber mMn. mehr arbeit.

Und die Klasse einfach zu kopieren und als Zweitklasse etwas umzubauen ist zwar wenig arbeit aber dafür gibts gleich mal ´n paar tausend Zeilen mehr Code. Ich musste nämlich 7 Klassen so umbauen, und die bestehen locker mal aus 500-1000 Zeilen Code.
 
da hast du natürlich recht, boolean wäre schon toller aber ich brauche den int Index weil der sich ja natürlich auch ändert. Normalerweise ist die Klasse so gestaltet das sie Daten von einem Shared-Memory eines Echtzeitprogramms abfragt, ich musste sie nun so umbauen das sie Daten von wo anders bezieht und dafür brauche ich einen History-Index, aber das nur wenn sie als Objekt unterhalb der History Klasse eingebaut wird.

und das war das knifflige dabei... Natürlich hätte ich nun ganz schön eine Klasse erstellen und von dieser erben können, aber mMn. mehr arbeit.

Und die Klasse einfach zu kopieren und als Zweitklasse etwas umzubauen ist zwar wenig arbeit aber dafür gibts gleich mal ´n paar tausend Zeilen mehr Code. Ich musste nämlich 7 Klassen so umbauen, und die bestehen locker mal aus 500-1000 Zeilen Code.
Das heißt deine Klasse hat eine Methode loadData(), die die Daten lädt.

Was spricht jetzt dagegen eine Klasse
Code:
KlasseHistoryC
wie folgt zu erzeugen:

Java:
public class KlasseHistoryC extends KlasseC{
  private int historyIndex;

  public KlasseHistoryC(int historyIndex){
    this.historyIndex = historyIndex;
  }

  public void loadData(){// overrides loadData in KlasseC
    // load data using history index
  }
}
Das sieht mir nicht nach viel Arbeit aus. Im Gegenteil. Du lässt alles gleich und ändert nur die Methode, die sich anders verhalten soll. Und alle Instanzen dieser Klasse kannst du ohne Probleme als KlasseC-Instanzen verkaufen.

Ich glaube dein Fehler besteht vielmehr darin, dass du die Daten bereits im Konstruktor laden willst. Das laden von Daten sollte man eher extern über eine init/load/whatever-Methode und nicht im Konstruktior machen. Eben weil es dann schwierig werden kann, solche Klassen zu erweitern.

Und solltest du jetzt auf die glorreiche Idee kommen diese Methode einfach aus dem Superkonstruktor aufzurufen, dann sei gewarnt: Alle Attribute der Subklasse sind zu diesem Zeitpunkt noch nicht gesetzt.
 
Zuletzt bearbeitet:
...Natürlich hätte ich nun ganz schön eine Klasse erstellen und von dieser erben können, aber mMn. mehr arbeit...

:bahnhof: hab ich doch gesagt...

...Ich glaube dein Fehler besteht vielmehr darin, dass du die Daten bereits im Konstruktor laden willst. Das laden von Daten sollte man eher extern über eine init/load/whatever-Methode und nicht im Konstruktior machen. Eben weil es dann schwierig werden kann, solche Klassen zu erweitern.

Und solltest du jetzt auf die glorreiche Idee kommen diese Methode einfach aus dem Superkonstruktor aufzurufen, dann sei gewarnt: Alle Attribute der Subklasse sind zu diesem Zeitpunkt noch nicht gesetzt.

Ah ok, schon wieder was gelernt :toll: Danke !
 

Neue Themen


Zurück
Oben