Я пытаюсь использовать дженерики, чтобы «обобщить» переменную, которая создает сетевые транспорты разных типов. Я не уверен, что правило "generic = no RTTI" лишает законной силы подход или нет, поскольку я еще не освоил дженерики.
Я читал этот пост:
Как правильно структурировать создание этого общего объекта , в котором говорится следующее:
Еще одна вещь, которую я хотел бы сделать, если это возможно, это изменить два
творения:
LAdapter := TSQLiteNativeConnectionAdapter.Create(LFilename)
LAdapter := TFireDacConnectionAdapter.Create(FDatabaseLink.FConnection as TFDConnection, FDatabaseLink.OwnedComponent)
чтобы использовать абстрактную функцию типа "GetAdapterClass" в родительском элементе
TModelDatabaseConnection и просто объявите класс адаптера в
ребенок сделать что-то вроде:
LAdapter := GetAdapterClass.Create...
Это именно то, что я хотел бы сделать также. Так что, если вы можете изобразить это:
type
TTransport<T> = class(TComponent)
private
...
function GetTransport: TTransport;
procedure SetTransport(AValue: TTransport);
...
public
...
property Transport: TTransport read GetTransport write SetTransport;
...
end;
TTCPIPTransport = class(TTransport<T>)
private
function GetSocket(Index: Integer): String;
procedure SetSocket(Index: Integer; AValue: String);
public
property Socket[Index: Integer]: String read GetSocket write SetSocket;
end;
TServiceTransport = class(TTransport<T>)
private
function GetServiceName: String;
procedure SetServiceName(AValue: String);
public
property ServiceName: String read GetServiceName write SetServiceName;
end;
TISAPITransport = class(TServiceTransport<T>);
THTTPSysTransport = class(TServiceTransport<T>)
private
function GetURL(Index: Integer): String;
procedure SetURL(Index: Integer; AValue: String);
public
property URL[Index: Integer]: read GetURL write SetURL;
end;
etc.
Идея состоит в том, чтобы создать базовый класс, который имеет все поля / свойства / методы, которые являются общими для всех транспортов, затем имеет промежуточные классы, которые содержат поля / методы / свойства, которые являются общими только для определенного подмножества транспортов, и затем иметь окончательная версия каждого транспорта должна соответствовать типу.
Поэтому, когда я звоню:
var
trans: TTransport<T> // or TTransport<TTCPIPTransport> etc.
begin
trans := TTransport<TTCPIPTransport>.Create(AOwner,....);
trans.Transport.Socket[0] := '127.0.0.1:8523';
OR
trans := TTransport<TISAPITransport>.Create(AOwner,...);
trans.Transport.ServiceName = 'Foo';
...
etc.
end;
или, может быть, даже более общий, но у каждого экземпляра trans - без приведения типов - есть свойства / поля / методы, которые являются специфическими для подкласса, автоматически отображаются.
Таким образом, у меня может быть экран конфигурации, который позволяет администратору выбирать тип транспорта, скажем, в поле со списком, значение этой переменной задает тип внутри кода <> в коде, и один набор кода обрабатывает создание объект по типу.
Возможно ли это с использованием дженериков?