Dav*_*d A 2 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;
Run Code Online (Sandbox Code Playgroud)
在我的buttonclick代码中,我以这种方式创建了所需的子类,并且正在工作.
.....
var
T:TBaseClass;
begin
case OP of
1: T:=Tchild1class.Create;
2: T:=TChild2Class.Create;
T.Doit;
T.Calculate;
end;
Run Code Online (Sandbox Code Playgroud)
我的问题是下一个.我可以在我的基本抽象类中创建一个构造函数创建过程,这取决于int参数生成所需的子类??? 例如:
constructor TBaseClass.Create(OP:integer);
begin
inherited;
case OP of
1: Tchild1class.Create; ///>>>???
2: TChild2Class.Create; //>>>>???
end;
Run Code Online (Sandbox Code Playgroud)
这可能吗?
这样做的最佳方法是什么?
Rob*_*edy 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;
Run Code Online (Sandbox Code Playgroud)
使用该技术,使构造函数成为虚拟有时很有用,但这不是必需的.