从抽象基类创建子类的最佳方法。
在我的项目中,我以这种方式有一个基类摘要和两个子类。
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;
这可能吗?
做到这一点的最佳方法是什么?
不,那是不可能的。构造函数开始运行后,将固定要创建的对象的类。一个对象即使在构造过程中也不能更改其类。
您可以编写一个带有整数参数并选择要实例化的后代类的工厂函数。这很像您建议的无效构造函数,就像一个独立的函数或类方法而不是构造函数一样。
您还可以编写一个仅返回该类的函数,然后可以将其实例化,如下所示:
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;
使用该技术,有时使构造函数为虚拟的很有用,但这不是必需的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句