1. würde ich mir überlegen, anstatt TList vielleicht TObjectList zu verwenden, dann hört die Pointerschieberei auf und die Typen sind etwas sicherer.
2. würde ich TItemList nicht mit TProduktList erweitern, sondern TProduktList von TTitemList ableiten. So sparst Du Dir die Eigenschaft Liste und kannst direkt darauf zugreifen.
3. TProdukt von TItem ableiten, so hat TProduct eine uid und kann bei der Suche nach selbigem benutzt werden.
Delphi-Quellcode:
function TItemListe.getPointerByUid(uid:Integer):TItem;
var i:INteger;
begin
Result := nil;
for i:=0 to Count-1 do
if Items[i].uid=uid then
begin
Result:=Items[i];
break;
end;
if Result = nil then
raise ERangeError.Create('Kein ItemListeneintrag gefunden! '+#13+'UID: '+IntToStr(uid));
end;
rocedure TProdListe.add(bez:String; preis:Double; (...));
var i:Integer
begin
Add(TProdukt.Create(bez, preis, (...)));
end;