In Ordnung, also habe ich eine Basisklasse, die wir TFruit
nennen. Von diesem gibt es verschiedene Nachkommen wie TApple
, TOrange
und so weiter. Ich muss die Eigenschaften der Nachkommen Klassen in einer Datei speichern.Sie müssen einen eindeutigen ganzzahligen Wert mit Klassen verknüpfen
Um beim Laden der Daten die richtige Klasse erstellen zu können, muss jede Klasse eine ID
haben, die ich in die Datei schreibe, bevor ich die eigentlichen Daten schreibe. Zur Zeit habe ich mit der folgenden Art und Weise tun kommen:
type
TFruit = class
const ID = 0;
end;
TApple = class(TFruit)
const ID = 1;
end;
TOrange = class(TFruit)
const ID = 2;
end;
Testing dieses, fand ich heraus, dass ich super vorsichtig sein müssen, welche Klasse ich erklären. Wenn ich diese verwenden:
var Fruit: TFruit;
Fruit := TOrange.Create;
... dann wird Fruit.ID
Null zurück. Allerdings Fruit
als TOrange
erklärt wird das erwartete Ergebnis Fruit.ID = 2
ergeben (Wer weiß, warum?)
Also im Grunde bin ich dieses Recht zu tun, oder gibt es einen besseren Weg, es zu tun? Eine Klassenfunktion zu erstellen und einen Wert von dort zurückzugeben, erscheint im Vergleich sehr hässlich (zusätzliche Funktionsdeklaration, Implementierung und Code).
Der Bequemlichkeit halber könnte man der Basisklasse von registrierten Objekten eine Klassenmethode hinzufügen, die die ID dieser Klasse zurückgibt. Und da Klassenmethoden (im Gegensatz zu statischen C# style-Methoden) den Klassentyp als "self" -Parameter erhalten, funktioniert dies wie erwartet. – CodesInChaos
@CodeInChaos, wahr, aber das würde erfordern, dass jede Klasse "weiß", dass es eine ID ist, die vermieden werden kann, und es könnte ein Schmerz werden, neue Nachkommen zu schaffen, herauszufinden, was die nächste verfügbare ID ist. –
Nein, ich meine, dass diese Methode Ihre 'FindID' Funktion mit' self' als Parameter aufruft. Es kann jedoch architektonisch besser sein, wenn Klassen selbst keine IDs kennen, da sie als Implementierungsdetail des Serialisierers betrachtet werden können. – CodesInChaos