我有一个要保密的类,因为我只在实现部分使用它。但是,它由在接口部分声明为公共的类使用。
有没有办法做这样的事情:
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错误] UnitX.pas(27):E2086类型“ TPrivate”尚未完全定义
我不想诉诸廉价的花招:
FPrivate = TObject
....
procedure TPublic.DoStuffWithFPrivate;
begin
TPrivate(FPrivate).Test;
有没有一种方法可以做我想要的而不必TPrivate
在界面中浪费内部细节?
我知道可以将TPrivate声明为TPublic的strict private
子类型,但是我不喜欢这给接口部分带来的污染。
有没有一种方法可以在保持类型安全的同时(尽可能多)将其TPrivate
排除在外interface
?
只要TPrivate
不在TPublic
字段声明(fi作为方法参数类型)的接口中的任何地方使用,就可以使用局部变量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;
好的,这只是便宜技巧的一点点变化,但是有哪些替代方法呢?您必须选择可用的东西,不是吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句