Wirkt dieser Schalter auf eine einzige Klasse oder auf eine ganze Klassenhierarchie? In letzterem Fall könntes du eine Basisklasse mit diesem Schalter definieren und alle Funktionen, die du brauchst, in solche Klassen auslagern. Diese Klassen würden dann ein Interface implementieren, das die jeweiligen Funktionen bereitstellt, implementieren. Ebenso die Klassen, denen diese Funktionen eingentlich zufallen sollten - dort fügst du eine Eigenschaft vom Typ des Interfaces ein, implementierst das Interface per delegation und fertig.
Beispiel:
Delphi-Quellcode:
type
IFoo = interface
procedure ShowFoo;
end;
{$METHODINFO ON}
TMyObject = class(TInterfacedObject)
end;
TIntegerGetter = function: Integer of object;
TFoo = class(TMyObject, IFoo)
private
fGetter: TIntegerGetter;
public
constructor Create(getter: TIntegerGetter);
procedure ShowFoo;
end;
TActualClass = class(TIrgendwas, IFoo)
private
fFoo: TFoo;
function IntegerGetter: Integer;
function _self: IFoo;
property FooImplementor: TFoo read fFoo implements IFoo;
public
constructor Create;
end;
constructor TFoo.Create(getter: TIntegerGetter);
begin
inherited Create;
fGetter := getter;
end;
procedure TFoo.ShowFoo;
begin
ShowMessage(IntToStr(fGetter()));
end;
function TActualClass.IntegerGetter: Integer;
begin
result := 42;
end;
constructor TActualClass.Create;
begin
inherited;
fFoo := TFoo.Create(IntegerGetter);
_self.ShowFoo;
end;
function TActualClass._self: IFoo;
begin
result := IFoo(self);
end;
Die _Self-Maschinerie musst du nur dann benutzen, wenn du nicht automatisch Zugriff auf die IFoo-Methoden hast - wie Delphi das genau löst, kann ich nicht sagen.