gpt4 book ai didi

delphi - 从抽象基类创建子类的最佳方法

转载 作者:行者123 更新时间:2023-12-03 18:08:20 25 4
gpt4 key购买 nike

从抽象基类创建子类的最佳方式。

在我的项目中,我以这种方式有一个基类抽象和两个子类。

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;

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

关于delphi - 从抽象基类创建子类的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17606847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com