delphi 我是否可以保存一个接口或继承类的Dictionary,然后从该Dictionary调用子类的Create?

gzjq41n4  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(104)

我想做的是有一个字典,里面有不同的类类型,它们都实现了一个接口或有一个共享的父类。使用这个列表,我想从一个字符串中示例化正确的一个,标识我想要的一个。
因此,如果列表是类“B”、“c”和“d”,它们都继承自“a”,或者都实现了一个接口“a”,我想将这些类型加载到一个列表中,并将类名作为标识符,然后创建与列表中的字符串匹配的任何类。
在B、c和d类中,我将其作为初始化部分的一部分添加到字典中。
我希望这是有意义的。这的最终目标是有数据库驱动的定制。
我首先尝试使用一个所有类都实现的接口,并且有一个字典<string,Interface>。我似乎无法将构造函数作为接口的一部分包含在内,所以我转向了另一个想法。
我试图让我所有的类都继承一个基类,并使用一些抽象函数/过程。我创建了字典<string,TBaseClass>,但当我试图向它添加一个子类时,它给了我e2010不兼容的类型。

92vpleto

92vpleto1#

如果所有的类都有一个公共的基类,你可以将它们的Meta类类型存储在字典中,然后在需要的时候构造它们,例如:

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

相关问题