Durch diesen Ansatz will ich aber gerade das Aufsplitten der Klassen auf unterschiedliche Units erreichen.
Aktuell habe ich eine große
pas Datei mit der Elternklasse sowie mehreren abgeleiteten Klassen.
Das macht das Debuggen oder das externe Vergleichen der unterschiedlichen Implementierungen mittels diff oder beyond compare sehr mühsam.
Ich hatte ja geschrieben, dass beim Verteilen der abgeleiteten Klassen in andere Units zirkuläre Referenzen entstehen. Das ist ja nicht per se verboten. Du kannst das ja erstmal machen und die jeweiligen Units in die implementation uses Anweisung von uParentDevice schreiben:
Delphi-Quellcode:
implementation
uses
uDevType1, uDevType2, uDevType2;
constructor TParentDevice.Create;
begin
inherited;
end;
Da die einzelnen Ableitungen an eine Enumeration gebunden sind, muss bei einer Erweiterung eh die uParentDevice angefasst werden. Die zirkulären Referenzen sind ja auch nur jeweils bidirektionaler Natur und das Ganze somit tolerierbar. Will man das Vermeiden muss man das Prinzip halt leicht abwandeln indem man z.B. deinen TDeviceHandler-Ansatz als Basis nimmt und das DeviceClass property dahin verlagert:
Delphi-Quellcode:
type
TDeviceHandler = class
private
class function GetDeviceClass(dtDeviceType: TDeviceType): TParentDeviceClass; static;
public
class property DeviceClass[dtDeviceType: TDeviceType]: TParentDeviceClass read GetDeviceClass; default;
end;
implementation
uses
uDevType1, uDevType2, uDevType2;
class function TDeviceHandler.GetDeviceClass(dtDeviceType: TDeviceType): TParentDeviceClass;
begin
case dtDeviceType of
dtDeviceType1: Result := TDeviceType1;
dtDeviceType2: Result := TDeviceType2;
dtDeviceType3: Result := TDeviceType3;
end;
end;
Der Aufruf ändert sich dann entsprechend:
Delphi-Quellcode:
var
myDevice1: TParentDevice;
myDevice2: TParentDevice;
begin
myDevice1 := TDeviceHandler[dtDeviceType1].Create;
...
myDevice2 := TDeviceHandler[dtDeviceType2].Create;