我是否必须在同一部分中定义类的前向声明和接口?

约翰

我有一个要保密的类,因为我只在实现部分使用它。但是,它由在接口部分声明为公共的类使用。

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

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

乌韦·拉贝(Uwe Raabe)

只要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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以同时指定模板类的一部分?(在“ <<”之前和“ <>”内部的部分)

来自分类Dev

是否可以同时指定模板类的一部分?(在“ <<”之前和“ <>”内部的部分)

来自分类Dev

同一部分中的内存是否总是连续分配?

来自分类Dev

反应this.props.id在类的一部分中未定义

来自分类Dev

用作基类接口一部分的标头应包含在派生类中吗

来自分类Dev

是否可以命名命令的一部分以在以后的同一命令中重用?

来自分类Dev

通过Go中的接口解耦...接口实现程序的一部分?

来自分类Dev

在类上实现接口,作为代码修复的一部分

来自分类Dev

在类上实现接口,作为代码修复的一部分

来自分类Dev

TypeScript:仅返回接口的一部分

来自分类Dev

js:我可以为作为变量定义一部分的html元素分配类或ID吗?

来自分类Dev

将用户和组保留在Django管理面板的同一部分中

来自分类Dev

如何隐藏从基类派生的类中的方法,该方法是基类中接口实现的一部分?

来自分类Dev

您如何获得%INCLUDE一部分中的Lotusscript声明中引用的文件

来自分类Dev

如何使条件If语句在Python中只必须满足其条件的一部分?

来自分类Dev

在 PL/SQL 中为查询的一部分声明语句

来自分类Dev

如何将类名的一部分定义为宏?

来自分类Dev

如何检查继承的属性是否是类(子类)的一部分

来自分类Dev

保存前处理数组的一部分

来自分类Dev

如何在接口块内指定模块变量作为伪参数声明的一部分?

来自分类Dev

我如何利用 TDD 删除类的面向公众的 API 的一部分?

来自分类Dev

我可以将资源定义为样式的一部分吗?

来自分类Dev

如何只为不同的文本元素(在同一类下)更改CSS类的一部分?

来自分类Dev

是否使anchortext成为href的一部分?

来自分类Dev

检查是否包含数组的一部分

来自分类Dev

检查输入是否是列表的一部分

来自分类Dev

检查我单击的标签是否是标签图案的一部分

来自分类Dev

包含URL的一部分和特定类的匹配链接

来自分类Dev

包含URL的一部分和特定类的匹配链接

Related 相关文章

  1. 1

    是否可以同时指定模板类的一部分?(在“ <<”之前和“ <>”内部的部分)

  2. 2

    是否可以同时指定模板类的一部分?(在“ <<”之前和“ <>”内部的部分)

  3. 3

    同一部分中的内存是否总是连续分配?

  4. 4

    反应this.props.id在类的一部分中未定义

  5. 5

    用作基类接口一部分的标头应包含在派生类中吗

  6. 6

    是否可以命名命令的一部分以在以后的同一命令中重用?

  7. 7

    通过Go中的接口解耦...接口实现程序的一部分?

  8. 8

    在类上实现接口,作为代码修复的一部分

  9. 9

    在类上实现接口,作为代码修复的一部分

  10. 10

    TypeScript:仅返回接口的一部分

  11. 11

    js:我可以为作为变量定义一部分的html元素分配类或ID吗?

  12. 12

    将用户和组保留在Django管理面板的同一部分中

  13. 13

    如何隐藏从基类派生的类中的方法,该方法是基类中接口实现的一部分?

  14. 14

    您如何获得%INCLUDE一部分中的Lotusscript声明中引用的文件

  15. 15

    如何使条件If语句在Python中只必须满足其条件的一部分?

  16. 16

    在 PL/SQL 中为查询的一部分声明语句

  17. 17

    如何将类名的一部分定义为宏?

  18. 18

    如何检查继承的属性是否是类(子类)的一部分

  19. 19

    保存前处理数组的一部分

  20. 20

    如何在接口块内指定模块变量作为伪参数声明的一部分?

  21. 21

    我如何利用 TDD 删除类的面向公众的 API 的一部分?

  22. 22

    我可以将资源定义为样式的一部分吗?

  23. 23

    如何只为不同的文本元素(在同一类下)更改CSS类的一部分?

  24. 24

    是否使anchortext成为href的一部分?

  25. 25

    检查是否包含数组的一部分

  26. 26

    检查输入是否是列表的一部分

  27. 27

    检查我单击的标签是否是标签图案的一部分

  28. 28

    包含URL的一部分和特定类的匹配链接

  29. 29

    包含URL的一部分和特定类的匹配链接

热门标签

归档