Du musst das etwas strukturierter betrachten.
Basisklassen sind ja gut und nützlich. Aber sie müssen nur das wissen und können, was wirklich alle Ableitungen gemeinsam haben.
Wenn Du eine Objektkopie erzeugen willst, dann kann Deine Basisklasse z.B. folgende Methode haben.
Delphi-Quellcode:
TBaseClass = class
function CreateCopy: TBaseClass; virtual;
end;
function TBaseClass.CreateCopy: TBaseClass;
begin
Result := nil;
end;
und die Ableitungen spezifizieren das:
Delphi-Quellcode:
TClassA = class(TBaseClass)
function CreateCopy: TBaseClass; override;
end;
function TClassA.CreateCopy: TBaseClass;
var
A: TClassA;
begin
A := TClassA.Create;
A.Assigned(Self);
// hier kann man auch noch beliebige andere (klassenspezifische) Dinge anstellen
Result := A;
end;
So brauchst Du später nicht nach Klassen unterscheiden und rufst einfach NewItem := aItem.CreateCopy auf.
Mit Assign funktioniert das ja genau so.
Du musst also so viel wie möglich in Klassen kapseln und gemeinsame Eigenschaften so weit oben deklarieren wie notwendig.
Dann wird das von allein übersichtlicher.
Wenn man keine gemeinsame Basisklasse verwenden kann oder will, kann man auch Interfaces benutzen. Das hat Vor- und Nachteile, ist aber auf jeden Fall etwas komplexer.