![]() |
TList / Interfaces
Kommt man da tatsächlich nicht weiter oder seh ich es einfach nicht?
Bitte keine guten Ratschläge zu TList/IList<T>/Spring4D und so weiter weil es sich um eine nicht diskutierbare Vorgabe handelt TList zu verwenden ;-) Es sei ein Interface
Delphi-Quellcode:
und eine Liste von diesen Dingern:
ISimpleInterface = interface
function GetID: Integer; procedure SetID(AValue: Integer); property ID: Integer read GetID write SetID; end;
Delphi-Quellcode:
Eine Erweiterung vom Interface:
TSimpleIntfList = class(TList<ISimpleInterface>)
public function ItemByID(AiID: Integer): ISimpleInterface; end;
Delphi-Quellcode:
Nun hätte ich gerne eine Ableitung von TSimpleIntfList, also
IModule = interface(ISimpleInterface)
function GetModNo: Integer; procedure SetModNo(AValue: Integer); property ModNo: Integer read GetModNo write SetModNo; end;
Delphi-Quellcode:
Aber
TModuleList = class(TSimpleInterfaceList<IModule>) // funkt nicht - schon klar
function ModuleByModNo(AiModNo: Integer): IModule; end;
Delphi-Quellcode:
sollte trotzdem noch funktionieren ...
ItemByID
Geht das? |
AW: TList / Interfaces
Nja wenn es ginge, dann höchstens so
Delphi-Quellcode:
oder
TSimpleIntfList<T> = class(TList<T>)
public function ItemByID(AiID: Integer): T; end;
Delphi-Quellcode:
hier im ItemByID dann ein cast von ISimpleInterface zu T (IModule) , weil die Liste natürlich ISimpleInterface speichert, aber auch den Nachfahren aufnehmen kann.
TSimpleIntfList<T> = class(TList<ISimpleInterface>)
public function ItemByID(AiID: Integer): T; end; |
AW: TList / Interfaces
Mmh, Zweiteres bringt mich auf eine Idee. Das probier ich gleich nach dem Aufstehen, danke!
|
AW: TList / Interfaces
Meine Lösung:
Delphi-Quellcode:
die Liste von diesen Dingern:
ISimpleInterface = interface
function GetID: Integer; procedure SetID(AValue: Integer); property ID: Integer read GetID write SetID; end; IModule = interface(ISimpleInterface) function GetModNo: Integer; procedure SetModNo(AValue: Integer); property ModNo: Integer read GetModNo write SetModNo; end;
Delphi-Quellcode:
eine generische Liste von (beinahe) beliebigem Nachfahrtyp:
TSimpleIntfList = class(TList<ISimpleInterface>)
public function SimpleItemByID(AiID: Integer): ISimpleInterface; end;
Delphi-Quellcode:
Eine konkrete Nachfahrliste:
TCustomIntfList<T: ISimpleInterface> = class(TSimpleIntfList)
strict private FrGuid: TGUID; public constructor Create; public function TypedItemAtIndex(AiIndex: Integer): T; end; uses System.SysUtils , System.TypInfo ; constructor TNntCustomIntfList<T>.Create; begin inherited Create; FrGuid := GetTypeData(TypeInfo(T))^.Guid; end; function TCustomIntfList<T>.TypedItemAtIndex(AiIndex: Integer): T; var LoItem: ISimpleInterface; begin LoItem := Items[AiIndex]; Supports(LoItem, FrGuid, Result); end;
Delphi-Quellcode:
TModuleList = class(TCustomIntfList<IModule>)
function ModuleByModNo(AiModNo: Integer): IModule; end; function ModuleByModNo(AiModNo: Integer): IModule; var LoItem : ISimpleInterface; LoModule: IModule; begin for LoItem in Self do begin if Supports(LoItem, IModule, LoModule) then begin if LoModule.ModNo = AiModNo then begin Exit(LoModule); end; end; end; Result := nil; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz