gpt4 book ai didi

delphi - 我必须在同一节中定义类的前向声明和接口(interface)吗?

转载 作者:行者123 更新时间:2023-12-03 19:07:08 29 4
gpt4 key购买 nike

我有一个我想保持私有(private)的类,因为我只在实现部分使用它。
但是,它由在接口(interface)部分中声明为公共(public)的类使用。

有没有办法做这样的事情:

unit x;

interface

type
TPrivate = class; //forward declaration

TPublic = class(TSomething)
private
FPrivate: TPrivate;
procedure DoStuffWithFPrivate;
public
//...
end;

implementation

type
TPrivate = class(TObject)
procedure Test;
end;

显然上面的代码给出了一个错误:

[dcc32 Error] UnitX.pas(27): E2086 Type 'TPrivate' is not yet completely defined



我不想诉诸廉价的把戏,比如:
FPrivate = TObject
....
procedure TPublic.DoStuffWithFPrivate;
begin
TPrivate(FPrivate).Test;

有没有办法做我想做的事而不必泄漏 TPrivate界面中的内部细节?

我知道可以将 TPrivate 声明为 strict private TPublic 的子类型,但是我不喜欢这给接口(interface)部分带来的污染。
有没有办法保留 TPrivateinterface部分(尽可能)同时保持类型安全?

最佳答案

只要TPrivateTPublic 的界面中的任何地方都没有使用除了字段声明(f.i. 作为方法参数类型),您还可以使用本地 class helper为达到这个。

注:FPrivate不是那个领域的好名字!

interface

type
THiddenActual = class
end;

TPublic = class
private
FActual: THiddenActual;
procedure DoStuffWithFPrivate;
public
end;

implementation

type
TActual = class(THiddenActual)
public
procedure Foo;
end;

type
TPublicHelper = class helper for TPublic
private
function GetActual: TActual;
procedure SetActual(const Value: TActual);
public
property Actual: TActual read GetActual write SetActual;
end;

procedure TActual.Foo;
begin
end;

function TPublicHelper.GetActual: TActual;
begin
Result := FActual as TActual;
end;

procedure TPublicHelper.SetActual(const Value: TActual);
begin
FActual := Value;
end;

procedure TPublic.DoStuffWithFPrivate;
begin
Actual.Foo;
end;

好吧,这只是那个廉价技巧的一点变化,但有什么替代方案呢?你必须拿走现有的东西,不是吗?

关于delphi - 我必须在同一节中定义类的前向声明和接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242300/

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