Instantiierung der Unterklasse mit existentem Oberobjekt?

  • Themenstarter Stephan.Woebbeking
  • Beginndatum
Status
Nicht offen für weitere Antworten.
S

Stephan.Woebbeking

Gast
Hallo,

ich hab gedacht ich bin nicht mehr wirklich Anfänger, aber jetzt zweifele ich doch ein wenig...

Bin hier auf eine klitzekleine Unstimmigkeit gestossen und hab das Gefühl es muss eine einfach Lösung geben, die mir einfach nicht einfallen will... aber irgendwo gibt es eine logische Lücke, die kann ich irgendwie nicht schliessen.

Also, reduzieren kann ich das Problem folgendermassen: Ich möchte in meinem Program mit grösseren Mengen Dateiinformationen arbeiten. Nun bekomme ich vom System ja ganz bequem Listen von "File" Objekten. Z.B. wäre eine ganz schöne Erweiterung zu einem File eine Funktion "public String getSuffix() { ... }". Ich habe noch mehr Methoden, aber wir können diese exemplarisch nehmen.

Jetzt hab ich mir eine neue Klasse gebaut (Inhalt der getSuffix() ist jetzt nicht so wichtig):

Code:
import java.io.File;

public class FileData extends File {
	public FileData(String name) {
		super( name );
	}
	public String getSuffix() {
		String line, res = "";

		logger.debug( "> getSuffix(" + super.getName() + ")" );
		line = super.getName();
		if ( line.length() > 3 ) {
			if ( line.charAt( line.length() - 4 ) == Constants.CH_FULL_STOP )
				res = line.substring( line.length() - 3 );
		}

		logger.debug( "< getSuffix(" + super.getName() + ")): " + res );
		return res;
	}
}

Soweit so gut, jetzt hab ich aber natürlich schon vom System meine Instanz von "File". Kann die natürlich nicht auf "FileData" casten, das wäre ein Cast auf die Unterklasse, das kann natürlich nicht sein, ich bekomme eine "IllegalCastException".

Folgende Ideen:
- Wenn ich "FileData" instantiiere und jedesmal das "File" in einer privaten Variablen halte, muss ich jeden Aufruf auf "File" durchleiten, also überschreiben und explizit auf die Oberklasse umleiten, das scheint mir wenig sinnvoll zu sein.
- Ich habe ja bereits die Instanz der Oberklasse, manuell setzen a la "super = iFile" im Konstruktor geht natürlich nicht, wäre auch das Chaos.
- Die Oberklasse "File" will ich natürlich auch nicht ändern, weil ich dann am System rumschraube, ähnlich grosses Chaos könnte sich ausbreiten.
- Reflection hilft mir m.E. auch nicht, es hilft eine Methode zu rufen, die erst zur Laufzeit bekannt ist, das Problem ist aber ja Instanz der Oberklasse schon da, Unterklasse muss aber noch initialisiert werden.
- Ich könnte "getSuffix()" immer mit dem "File" versorgen, also eine statische Methoden nehmen, das scheint mir derzeit noch das praktikabelste zu sein, aber gut schaut das auch nicht aus.


Jemand einen Lösungsansatz für mich? Oder wenigstens weitere Ideen?
 

Niki

Top Contributor
Meiner meinung nach hast du zwei Möglichkeiten, entweder du verwendest, wie du schon sagtest, eine statische Methode die du dann in eine Klasse FileUtil oder so packst. Oder du baust dir einen File-Wrapper, der das File als Attribut hält. Ich würde aber die Methoden nicht nochmal implementieren, sondern einfach eine getFile Methode anbieten.
 

hupfdule

Top Contributor
Anonymous hat gesagt.:
- Wenn ich "FileData" instantiiere und jedesmal das "File" in einer privaten Variablen halte, muss ich jeden Aufruf auf "File" durchleiten, also überschreiben und explizit auf die Oberklasse umleiten, das scheint mir wenig sinnvoll zu sein.
- Ich könnte "getSuffix()" immer mit dem "File" versorgen, also eine statische Methoden nehmen, das scheint mir derzeit noch das praktikabelste zu sein, aber gut schaut das auch nicht aus.

Die beiden sind die einzig sinnvollen deiner Ideen. Und beide werden auch in der Praxis benutzt. Der erste Fall lohnt sich aber nicht für derart kleine Erweiterungen, wie du sie vor hast. Der Aufwand ist, wie du ja selbst bemerkt hast, zu groß.

Die zweite Variante ist aber für dein Vorhaben genau die richtige. Was stört dich daran? Du hast eine Hilfsmethode, die ein Objekt entgegen nimmt, darauf Berechnungen anstellt und ein Ergebnis zurück liefert. Ist doch super.
 
Hmm, ok, herzlichen Dank für die Beiträge! Wie es oft ist, während ich geschrieben habe, ist mir das Ganze selber auch wieder etwas klarer geworden. :eek:) Ich hoffte noch, dass es doch eine Möglichkeit geben würde, eine echte Objektstruktur aufzubauen und das bereits instanziierte Objekt der Oberklasse einzubinden.

Aber wenn das tatsächlich nicht geht werde ich wohl auf die statischen Methoden zurückgreifen. Schöner fände ich es, wenn die Methoden "echt" am Objekt hängen würden, aber ok, so geht es ja auch.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben