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):
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?
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?