Wieso schreibst Du dir keinen WerkzeugPropertySetter und eine Factory, die Dir zu dem Werkzeug ('Item') die passende Klasse liefert, welche dann die Daten setzt. Wenn bei deinem Ansatz nämlich noch ein TWerkzeug4 hinzukommt, musst Du deinen Code anpassen, und das wäre dann so gar nicht OCP.
Delphi-Quellcode:
Type
IWerkzeugPropertySetter = interface
SetProperties(Item : TWerkzeug0);
end;
procedure TDrawPadProperties.SetProperties(Item: TWerkzeug0);
var
propertySetter : IWerkzeugPropertySetter;
begin
propertySetter := WerkzeugPropertySetterFactory.Create(Item);
propertySetter.SetProperties(Item);
end;
Leider musst Du in den einzelnen Setterklassen dann dein 'Item' immernoch konkret auf TWerkzeugX casten, aber da Du keine Generics benutzt, bleibt dir hier dann wohl nichts anderes übrig. Mit Generics würde das so aussehen (so ungefähr jedenfalls)
Delphi-Quellcode:
Type
IWerkzeugPropertySetter<T : TWerkzeug0> = interface
SetProperties(Item : T);
end;
WerkzeugPropertySetterFactory = class
Function Create<T : TWerkzeug0> (Item : T) : IWerkzeugPropertySetter<T>;
End;
procedure TDrawPadProperties.SetProperties<T:TWerkzeug0>(Item: T);
var
propertySetter : IWerkzeugPropertySetter<T>;
begin
propertySetter := WerkzeugPropertySetterFactory.Create<T>(Item);
propertySetter.SetProperties(Item);
end;
Und das wäre dann typsicher. Wenn nun ein 4. Werkzeug hinzukommst, schreibst Du eine neue Klasse dafür und registrierest diese in der Factory.