gpt4 book ai didi

delphi - 如何访问子类中的函数?

转载 作者:行者123 更新时间:2023-12-01 19:29:18 24 4
gpt4 key购买 nike

子类可以访问父类中的 protected 函数,但父类不能访问子类中的 protected 函数。

我希望这两个类尽可能保持私有(private)。父类是一个表单,仅使用一次实例。子类中的所有函数都是静态的,它继承自父类。

如何从父类访问子类(在另一个单元)中的非公共(public)静态方法?

编辑:

父类(第一单元):

interface

type
TParent = class
public
procedure Initialize;
protected
procedure Test; virtual;
end;

implementation

procedure TParent.Initialize;
begin
Writeln('Initializing');
Test;
end;

procedure TParent.Test;
begin

end;

child 类(第二单元):

interface

uses
ParentClass;

type
TChild = class(TParent)
protected
procedure Test;override;
end;

implementation

procedure TChild.Test;
begin
Writeln('Test!');
end;

代码(第三单元):

var c:TParent;

begin
try
c := c.Create;
c.Initialize;
c.Free;
Readln;
end;

输出只是“初始化”。我尝试调试它,它没有到达子类。

最佳答案

实际上有几种方法可以做到这一点,在您的父类中,创建您调用的虚拟方法,但这些方法不执行任何操作。在您的子类中,重写这些方法。这些方法很容易受到保护,但它们必须存在于父级中。

type
TParent = class
protected
procedure SpecialProcessing; virtual;
public
procedure DoWork;
end;

TChild = class(TParent)
protected
procedure SpecialProcessing; override;
end;

procedure TParent.DoWork;
begin
SpecialProcessing;
end;

procedure TParent.SpecialProcessing;
begin
// does nothing, placeholder
end;

procedure TChild.SpecialProcessing;
begin
// do special work here
end;

我故意没有将 TParent.SpecialProcessing 抽象化。这是可以做到的,但前提是 TParent 永远不会被直接创建,只有后代才会被直接创建。抽象方法是一种未实现的方法,但用作稍后子级实现的占位符。

要创建实例,请使用以下命令:

var
C : TParent;
begin
// Create as a TChild, which is a TParent decendant
C := TChild.Create;
try
C.DoWork;
finally
C.Free;
end;
end;

关于delphi - 如何访问子类中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1155145/

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