从抽象Base类创建子类的最佳方法

时间:2013-07-12 03:03:30

标签: delphi polymorphism abstract-class delphi-xe3

从抽象Base类创建子类的最佳方法。

在我的项目中,我有一个基类抽象和两个子类。

TbaseClass=class
public
    procedure Doit;virtual;abstract;
    procedure Calculate;virtual;abstract;


Tchild1class=class(TbaseClass)
..
protected
    procedure CalcArea;virtual;
public
    procedure Doit;override;
    procedure Calculate;override;


Tchild2class=class(Tchild1class)
protected
    procedure CalcArea;override;

在我的buttonclick代码中,我以这种方式创建了所需的子类,并且正在运行。

.....
var
 T:TBaseClass;
begin
    case OP of
    1: T:=Tchild1class.Create;
    2: T:=TChild2Class.Create;
T.Doit;
T.Calculate;
end;

我的问题是下一个问题。 我可以在我的基本抽象类中创建一个构造函数创建过程,这取决于int参数生成所需的子类??? 例如:

constructor TBaseClass.Create(OP:integer);
begin
inherited;
case OP of
    1: Tchild1class.Create; ///>>>???
    2: TChild2Class.Create; //>>>>???
end;

这可能吗?。

这样做的最佳方法是什么?。

1 个答案:

答案 0 :(得分:10)

不,那是不可能的。构造函数开始运行后,正在创建的对象类是固定的。即使在施工期间,对象也无法改变其类别。

您可以编写工厂函数,它接受整数参数并选择要实例化的后代类。这很像你提出的无效构造函数,就像一个独立的函数或类方法而不是构造函数。

您还可以编写一个只返回的函数,然后您可以在以后实例化它,如下所示:

type
  TBaseClassClass = class of TBaseClass;

function GetDescendantClass(op: Integer): TBaseClassClass;
begun
  case op of
    1: Result := TChild1Class;
    2: Result := TChild2Class;
    else Assert(False);
  end;
end;

var
  DescendantClass: TBaseClassClass;

DescendantClass := GetDescendantClass (op);
T := DescendantClass.Create;
T.DoIt;

使用该技术,使构造函数成为虚拟有时很有用,但这不是必需的。