我有一个我想保持私有(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)部分带来的污染。有没有办法保留
TPrivate
出interface
部分(尽可能)同时保持类型安全?
最佳答案
只要TPrivate
在TPublic
的界面中的任何地方都没有使用除了字段声明(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/