Понадобилось в проекте использовать
- Код: Выделить всё
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);
}
}