如何创建类的新实例?

X-R*_*Ray 1 delphi rtti delphi-2009

我有一个各种类的实例列表.我需要能够在不知道要创建什么的情况下创建类的新实例.所涉及的所有对象都具有相同的祖先.实际复制对象的成员变量很容易......这是我遇到问题的新对象的创建.

不可否认我可以这样做:

case MyObjectTypeInstance.MyTypeEnum of
  obj1:
    Result:=TObjectType1.Create;

  obj2:
    Result:=TObjectType2.Create;

  obj3:
    Result:=TObjectType3.Create;
end;
Run Code Online (Sandbox Code Playgroud)

这不符合"开放/封闭原则".

最初我以为我可以做一些像"结果:= MyObjectTypeInstance.Create;" 但由于破坏者的困难,这并不像希望的那样有效.

这是最新的猜测我应该怎么做...

var
  fooA, fooB:TFoo;
begin
  fooA:=TFoo2.Create;    // it could be any of many types

  fooB:=?  // how to create fooB of same class type as fooA????

  // do something

  fooA.Free;
  fooB.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我会以为这会更容易!

谢谢您的帮助!

Too*_*the 11

如果所有类都有共同的祖先,你可以这样做:

type
  TAncestor = class;
  TAncestorClass = class of TAncestor;
  TAncestor = class 
  public
    constructor Create; virtual;

    class function CreateClass(const AId: string): TAncestor;
    class procedure RegisterClass(const AId: string; const AType: TAncestorClass);
  end;


class function TAncestor.CreateClass(const AId: string): TAncestor;
var
  atype : TAncestorClass;
begin
  atype := GetAncestorClass(AId);
  if atype<>nil then
    Result := atype.Create
  else
    Result := nil;
end;

class procedure TAncestor.RegisterClass(const AId: string; 
  const AType: TAncestorClass);
begin
  SetAncestorClass(AId, AType); // Link id to class type
end;
Run Code Online (Sandbox Code Playgroud)

您可以使用任何类型的标识进行类型注册.只要它们是独一无二的.


gab*_*abr 8

选项1 - 创建名称/类映射列表:有没有办法在delphi中通过名称实例化一个类?

选项2 - 使用'of class'变量.

type
  TBaseObj = class
  end;

  TObjA = class(TBaseObj)
  end;

  TBaseObjClass = class of TBaseObj;

var
  objCls: TBaseObjClass;
  obj: TBaseObj;

objCls := TObjA;
obj := objCls.Create;
//obj is of type TObjA
Run Code Online (Sandbox Code Playgroud)