Man kann das sehr elegant auch ohne den DeviceHandler machen:
Delphi-Quellcode:
unit uParentDevice;
interface
type
TDeviceType = (dtDeviceType1, dtDeviceType2, dtDeviceType3);
TParentDeviceClass =
class of TParentDevice;
TParentDevice =
class
private
class function GetDeviceClass(dtDeviceType: TDeviceType): TParentDeviceClass;
static;
public
constructor Create;
virtual;
class property DeviceClass[dtDeviceType: TDeviceType]: TParentDeviceClass
read GetDeviceClass;
default;
end;
implementation
type
TDeviceType1 =
class(TParentDevice);
TDeviceType2 =
class(TParentDevice);
TDeviceType3 =
class(TParentDevice);
constructor TParentDevice.Create;
begin
inherited;
end;
class function TParentDevice.GetDeviceClass(dtDeviceType: TDeviceType): TParentDeviceClass;
begin
case dtDeviceType
of
dtDeviceType1: Result := TDeviceType1;
dtDeviceType2: Result := TDeviceType2;
dtDeviceType3: Result := TDeviceType3;
end;
end;
Zum Erzeugen einer passenden Instanz schreibt man dann einfach:
Delphi-Quellcode:
var
myDevice: TParentDevice;
begin
myDevice := TParentDevice[dtDeviceType1].Create;
end;
Werden die abgeleiteten Klassen in separate Units verteilt, entstehen natürlich zirkuläre
Unit-Referenzen. Um die zu vermeiden, gibt es andere Mechanismen, über die wir dann bei Bedarf ja noch sprechen können.