我可以保存接口或继承类的字典,然后对该字典中的子类调用 Create 吗?

Can I save a Dictionary of interfaces or the inherited classes and then call Create on the sub-classes from that dictionary?

提问人:Joseph 提问时间:10/24/2023 最后编辑:NimanthaJoseph 更新时间:11/18/2023 访问量:75

问:

我想做的是拥有一个不同类类型的字典,这些类类型都实现了一个接口或有一个共享的父类。使用此列表,我想从标识我想要的字符串中实例化正确的列表。

因此,如果列表是类“b”、“c”和“d”,它们都继承自“a”,或者都实现了接口“a”,我想将这些类型加载到一个列表中,并将类名作为标识符,然后创建与列表中的字符串匹配的任何类。

在 b、c 和 d 类中,我将其作为初始化部分的一部分添加到字典中。

其最终目标是实现数据库驱动的自定义。

我首先尝试使用所有类都实现的接口,并具有字典<字符串 Interface>。我似乎无法将构造函数作为界面的一部分,所以我转向了另一个想法。

我试图让我的所有类都继承一个基类,其中包含我将使用的一些抽象函数/过程。我制作了 dictionary<string,TBaseClass> 但是当我尝试将我的一个子类添加到其中时,它给了我 e2010 不兼容的类型。

Delphi 继承 接口 Parent-Child Pascal

评论


答:

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']();
...