Betrachten Sie eine Schnittstelle wieObjektorientierung und Serialisierung
IMyInterface = interface
procedure DoSomethingRelevant;
procedure Load (Stream : TStream);
procedure Save (Stream : TStream);
end;
und mehrere Klassen, die die Schnittstelle implementieren:
TImplementingClass1 = class (TInterfacedObject, IMyInterface)
...
end;
TImplementingClass2 = class (TInterfacedObject, IMyInterface)
...
end;
...
Ich habe eine Klasse, die eine Liste von IMyInterface Implementierer hat:
TMainClass = class
strict private
FItems : TList <IMyInterface>;
public
procedure LoadFromFile (const FileName : String);
procedure SaveToFile (const FileName : String);
end;
Nun zur Frage: Wie kann ich die Hauptklasse und vor allem die Objektliste in ein Objekt-Orientierungssystem laden ed-Art? Bevor ich die virtuelle Load-Methode für die Elemente aufrufen kann, muss ich sie erstellen und muss daher deren Typ kennen. In meiner aktuellen Implementierung speichere ich die Anzahl der Elemente und dann für jedes Element
- eine Typkennung (IMyInterface bekommt eine zusätzliche GetID Funktion)
- Aufruf der Save-Methode des Elements
Aber die während des Ladens bedeutet, dass ich so etwas wie
ID := Reader.ReadInteger;
case ID of
itClass1 : Item := TImplementingClass1.Create;
itClass2 : Item := TImplementingClass2.Create;
...
end;
Item.Load (Stream);
zu tun haben, aber das ist nicht zu sehr objektorientiert scheint, da ich mit vorhandenen Code Geige haben allen Zeit füge ich einen neuen Implementor hinzu. Gibt es einen besseren Weg, um mit dieser Situation umzugehen?
Delphi. Es überrascht mich jedes Mal, wenn ich Delphi-Code in aktuellen Foren/Foren sehe. Ich wusste nicht, dass es noch so oft benutzt wurde. –
@jeyoung: Delphi ist und bleibt die ** BESTE ** und produktivste Option, die derzeit zum Schreiben von nativem 32-Bit Windows-Code zur Verfügung steht - warum sind Sie so überrascht? –