提问人:Joseph 提问时间:10/24/2023 最后编辑:NimanthaJoseph 更新时间:11/18/2023 访问量:75
我可以保存接口或继承类的字典,然后对该字典中的子类调用 Create 吗?
Can I save a Dictionary of interfaces or the inherited classes and then call Create on the sub-classes from that dictionary?
问:
我想做的是拥有一个不同类类型的字典,这些类类型都实现了一个接口或有一个共享的父类。使用此列表,我想从标识我想要的字符串中实例化正确的列表。
因此,如果列表是类“b”、“c”和“d”,它们都继承自“a”,或者都实现了接口“a”,我想将这些类型加载到一个列表中,并将类名作为标识符,然后创建与列表中的字符串匹配的任何类。
在 b、c 和 d 类中,我将其作为初始化部分的一部分添加到字典中。
其最终目标是实现数据库驱动的自定义。
我首先尝试使用所有类都实现的接口,并具有字典<字符串 Interface>。我似乎无法将构造函数作为界面的一部分,所以我转向了另一个想法。
我试图让我的所有类都继承一个基类,其中包含我将使用的一些抽象函数/过程。我制作了 dictionary<string,TBaseClass> 但是当我尝试将我的一个子类添加到其中时,它给了我 e2010 不兼容的类型。
答:
3赞
Remy Lebeau
10/24/2023
#1
如果所有类都有一个公共基类,则可以将其元类类型存储在字典中,然后在需要时构造它们,例如:
type
TBaseClass = class
public
constructor Create; virtual;
...
end;
TClassOfBase = class of TBaseClass;
...
var
Dict: TDictionary<string, TClassOfBase>;
type
TClassB = class(TBaseClass)
...
end;
...
Dict.Add('b', TClassB);
var
obj: TBaseClass;
obj := Dict['desiredType'].Create;
...
obj.Free;
如果所有类都有一个通用接口,则可以将工厂函数存储在字典中,然后在需要时调用它们,例如:
type
IMyInterface = interface
...
end;
...
var
Dict: TDictionary<string, TFunc<IMyInterface>>;
type
TClassB = class(TInterfaceObject, IMyInterface)
...
end;
...
Dict.Add('b',
function: IMyInterface;
begin
Result := TClassB.Create;
end
);
var
intf: IMyInterface;
intf := Dict['desiredType']();
...
评论