Hallo,
danke für die schnellen Antworten,
GetInterfaceEntry funktioniert wunderbar. Habe in der Zwischenzeit noch
TInterfacedPersistent gefunden was ich anstelle von
TInterfacedObject verwenden kann, kommt mir an anderen Stellen noch mehr zugute, da ich noch andere Stellen habe wo ich testen muss ein Objekt ein bestimmtes Interface unterstützt.
@himitsu: Im Prinzip hast du Recht, und ich verwende das auch so, nur habe ich eine Methode in der Basis-Klasse die von den Vorfahren per inherited aufgerufen wird und Default-Funktionen ausführt, die abgeleiteten Klassen erweitern diese nur. Jetzt müsste ich in jedem Nachfahren, der das Interface implementiert, immer wieder den gleichen Code einfügen...
Delphi-Quellcode:
procedure Vater.DoSomething;
begin
ActionEins.Enabled := Check...
ActionZwei.Enabled := Check...
end;
procedure Sohn.DoSomething;
begin
inherited;
ActionDrei.Enabled := Check...
ActionInterface.Enabled := Check...
end;
procedure Tochter.DoSomething;
begin
inherited;
ActionVier.Enabled := Check...
end;
procedure Enkel.DoSomething;
begin
inherited;
ActionFünf.Enabled := Check...
ActionInterface.Enabled := Check...
end;
Um das zu umgehen:
Delphi-Quellcode:
procedure Vater.DoSomething;
begin
ActionEins.Enabled := Check...
ActionZwei.Enabled := Check...
if ( Supports(Self, MyInterface) ) then
ActionInterface.Enabled := Check...
end;
Spart mir viel redundanten Code... Ich bin mir bewusst das man das auch über Klassen lösen könnte, aber ich habe eine bestehende Klassenhierarchie und möchte nur ein paar Objekte um Funktionen erweitern, will aber erkennen ob ich ein gerade ein Objekt vor mir habe das ein bestimmtes Verhalten implementiert. Ich arbeite viel mit:
Delphi-Quellcode:
procedure DoSomething(Vater: TVater);
var
auto; IHatEinAuto;
begin
if ( Supports(Vater, IHatEinAuto, auto) ) then
auto.FahreLos;
end;
procedure UndLos;
var
sohn: TSohn; tochter: TTochter; enkel: TEnkel;
begin
sohn := TSohn.Create;
DoSomething(sohn);
sohn.DoAnything;
tochter := TTochter.Create;
DoSomething(tochter);
tochter.DoAnything;
enkel := TEnkel.Create;
DoSomething(enkel);
enkel.DoAnything;
end;