Danke für die Erklärung. Der Gedanke hinter dem ganzen ist, daß ich in meiner Basisklasse (abgeleitet von TList) einige Methoden implementiert habe, welche nach bestimmten Kriterien Unterobjekte liefern und das soll natürlich in abgeleiteten Klassen auch funktionieren.
Code: Alles auswählen
{$ModeSwitch nestedprocvars}
type
TBase = class;
TFirstThatFunction = function(Item : TBase) : boolean is Nested;
TBase = class ( TList )
function FirstThat(Test : TFirstThatFunction) : TBase;
end;
implementation
function TBase.FirstThat(Test : TFirstThatFunction) : TBase;
var i : integer;
begin
for i := 0 to Count - 1 do
begin
Result := TBase(Items[i]);
if Test(Result) then exit;
end;
Result := nil;
end;
Was genau in der Testfunktion geprüft wird, steht hier noch nicht fest und ist vom Anwendungsfall abhängig.
Ich hab beispielsweise in einer abgeleiteten Klasse ein Flag
modified. Wenn das abgefragt wird, dann gilt: Modified ist True wenn das Objekt oder eines seiner Unterobjekte Modified True gesetzt hat.
Code: Alles auswählen
// Getter for modified Flag
function TDerived.GetModified : boolean;
function Test(Item : TBase) : boolean;
begin
Result := TDerived(Item).Modified;
end;
begin
Result := fModified;
if not Result then Result := Assigned(FirstThat(@Test));
end;
Hier wird rekursiv durch alle Unterobjekte iteriert und geschaut, ob sich eines findet, welches modifiziert wurde.
Das ganze funktioniert einwandfrei, ich muss halt jedesmal einen TypeCast machen.
Ich kann natürlich FirstThat virtual machen und dann in jeder abgeleiteten Klasse neu definieren mit dem jeweiligen Klassentyp.
Das führt aber die Funktionalität der Vererbung ad absurdum.
Es bräuchte sowas wie ein Parameter vom Typ (TBase oder einer seiner Nachfahren).