Hallo Eddie,
Vererbung ist bei der Abbildung von irgend etwas realem meistens gefährlich. In vielen Fällen (auch in diesem) ist es besser, sie durch Relationen zu ersetzen. Vererbung eignet sich mehr für technische Klassen oder in den seltenen Fällen, wo wirklich feststeht, dass sich die Beziehung niemals ändern kann.
Für deinen Fall sehe ich spontan zwei Lösungsmöglichkeiten:
1. Eine zusätzliches Zustandsobjekt für ein Foto:
class Foto {
int breite;
int höhe;
int dateigröße;
FotoState state;
void store(...) {}
}
abstract class FotoState {
...
}
class FotoNew {
...
}
class FotoStored {
String description;
String path;
...
}
Die Idee ist also, dass das Fotoobjekt ein Zustandsobjekt referenziert, dass alle Information speichert, die Zustandsabhängig ist.
Die Methode store(...) kann nun so implementiert werden, dass überprüft wird, ob das Foto neu ist, das Foto gespeichert und das Zustandsobjekt durch eine Instanz von FotoStored ersetzt wird.
2. Trennen zwischen einem echten, gepseicherten Foto und einer beschreibung des Fotos:
class FotoDescriptor {
int breite;
int höhe;
int dateigröße;
Foto foto;
void store(...);
}
class Foto {
String description;
String path;
...
}
Die Methode store kann nun so implementiert werden, dass sie ein neues Foto-Objekt erzeugt und das Foto speichert. Anfangs ist die Eigenschaft foto einfach null.
Ein entscheidender Vorteil dieser Lösungen ist auch, dass Du keine Objekte ersetzen musst. Bei Deiner Lösung müsstest Du Instanzen von NewFoto durch solche von ExisitingFoto ersetzen. Das ist aber meistens sehr schwierig, da Du wissen musst, wo das Objekt gerade überall benutzt wird.
Bei diesen Lösungen hingegen wird einfach Information im Objekt hinzugefügt bzw ausgetauscht. Es kann natürlich passieren, dass an einer Stelle Information nicht verfügbar ist, die benötigt wird. Man muss also etwas darauf achten, in welchem Zustand ein Objekt gerade ist.
Grüße
Daniel