Ja, stimmt. Der generische Part der TObjectList<T> geht damit verloren. Wenn du das nicht nachbilden und trotzdem bei dem Ansatz mit dem ParentObject bleiben willst, kannst du entweder den HardCast auf TObjectList<TBase> vom Anfang machen oder über über ein OnChanged-Event oder ein Interface arbeiten.
Eine ganz andere Alternative wäre auch ein Message-Mechanismus:
Delphi-Quellcode:
const
cNotifyChanged = 1;
type
TBase = class;
TBaseObjectList<T: TBase> = class(TObjectList<T>)
private
FChanged: Boolean;
protected
procedure NotifyChanged(var Message: TDispatchMessage); message cNotifyChanged;
public
property Changed: Boolean read FChanged write FChanged;
end;
...
procedure TBase.SetChanged(const Value: Boolean);
var
msg: TDispatchMessage;
begin
if FChanged <> Value then begin
FChanged := Value;
msg.MsgID := cNotifyChanged;
FParentObject.Dispatch(msg);
end;
end;
...
procedure TBaseObjectList<T>.NotifyChanged(var Message: TDispatchMessage);
begin
Changed := True;
end;