Понадобилось в проекте использовать
- Код: Выделить всё
- TDictionary<string, T>
в итоге то что я смог найти выродилось вот в такое
- Код: Выделить всё
- // lasarusовский генерек словарь
 AdapterTypesClass = class of TBaseAdapter; // некий базовый класс, потомков которого надо хранить в этом листе
 AdapterTypesDict = specialize TDictionary<string, AdapterTypesClass>; // сам лист сопоставление имен и классов
используется для создания нужного экземпляра класса
- Код: Выделить всё
- // Интерфейс фабрики для создания экземпляров
 IAdapterFactory = interface
 function CreateAdapter(AOfficeNum: Integer; AOpType: TOperType; AAdapterName: string): TBaseAdapter;
 end;
 // Фабрика для создания экземпляров TBaseAdapter
 TAdapterFactory = class(TInterfacedObject, IAdapterFactory)
 private
 FAdapterTypes: AdapterTypesDict;
 public
 constructor Create;
 destructor Destroy; override;
 procedure RegisterAdapterType(AName: string; AClass: AdapterTypesClass);
 function CreateAdapter(AOfficeNum: Integer; AOpType: TOperType; AAdapterName: string): TBaseAdapter;
 procedure FillAdapters;
 end;
 constructor TAdapterFactory.Create;
 begin
 FAdapterTypes := AdapterTypesDict.Create();
 end;
 destructor TAdapterFactory.Destroy;
 begin
 FAdapterTypes.Free;
 inherited;
 end;
 procedure TAdapterFactory.RegisterAdapterType(AName: string; AClass: AdapterTypesClass);
 begin
 FAdapterTypes.Add(AName, AClass);
 end;
 function TAdapterFactory.CreateAdapter(AOfficeNum: Integer; AOpType: TOperType; AAdapterName: string): TBaseAdapter;
 var
 AdapterClass: AdapterTypesClass;
 begin
 if not FAdapterTypes.TryGetValue(AAdapterName, AdapterClass) then
 raise Exception.Create('Adapter type not registered: ' + AAdapterName);
 Result := AdapterClass.Create(AOfficeNum, AOpType);
 end;
 procedure TAdapterFactory.FillAdapters;
 begin
 RegisterAdapterType('LoginChangeAdapter', TLoginChangeAdapter);
 RegisterAdapterType('FindUserAdapter' , TFindUserAdapter);
 RegisterAdapterType('GetUserAdapter', TGetUserAdapter);
 RegisterAdapterType('GetGroupAdapter' , TGetGroupAdapter);
 RegisterAdapterType('UserStateAdapter ', TUserStateAdapter );
 RegisterAdapterType('PassChangeAdapter ' , TPassChangeAdapter );
 end;
Извиняюсь за количество кода, сам уже малость запутался
Собсвенно вопросы
1. В куче мест написано что
- Код: Выделить всё
- FAdapterTypes := AdapterTypesDict.Create();
нужно вызывать с опцией [doOwnsValues], но у меня такого конструктора нет
- Код: Выделить всё
- использую под astroй Lazarus 3.2 (rev Unversioned directory) FPC 3.2.2 x86_64-linux-gtk2
2. Есть ли более простой способ реализации аналога C#
- Код: Выделить всё
- public class Foo<T> : Form where T : class, new()
 {
 public int Boo<T> (int id)
 {
 T someT = new T();
 someT.somemethod(id);
 }
 }




 
 