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

问题描述 投票:0回答:1

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

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

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

我希望这是有道理的。这样做的最终目标是实现数据库驱动的定制。

我首先尝试使用所有类都实现并具有字典的接口。我似乎无法将构造函数作为界面的一部分包含在内,因此我转向了另一个想法。

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

delphi inheritance interface parent-child pascal
1个回答
0
投票

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

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']();
...
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.