如何隐藏仅在私有关联中使用的成员类?

3

在下面这个例子中,有没有办法将类TPrivateUseOnly变成私有或者移动到implementation部分?我认为不可能。但我不确定是否错过了新一代Delphi语言的某些面向对象编程特性。

unit Unit1;

interface

type
  TPrivateUseOnly = class(TObject)
  end;

  TMyClass = class(TObject)
  strict private
    FXYZ: TPrivateUseOnly;
  public
    ...
  end;

implementation

end.

我会将那个“私有类”放入一个单独的单元中,该单元不会用于“公共”(虽然仍然很难防止),但这只是对你所要求的东西的一个“不好的”解决方法... - TLama
1
将类隐藏起来,还是让读者看不到它?如果是前者,可以将其设置为私有嵌套类。如果是后者,则可以将其设置为接口,并在不分发源代码的单元中实现。 - Rudy Velthuis
1个回答

4

您可以创建一个嵌套类。如果您将此类放在严格的私有部分中,则其他单元将无法使用它:

type
  TMyClass = class(TObject)
  strict private
    type
      TPrivateUseOnly = class(TObject)
        test: boolean;
      end;
  strict private
    FXYZ: TPrivateUseOnly;
  public
    ...
  end;

如果我试图在另一个单元中访问私有类,则会出现以下错误:
[DCC Error] Unit1.pas(28): E2361 Cannot access private symbol TMyClass.TPrivateUseOnly

当你引用TMyClass内部的嵌套类时,可以使用TPrivateUseOnly来访问它。如果需要在本单元内访问,则需要设置为private,并使用TMyClass.TPrivateUseOnly进行访问。


1
这是有文档记录的:[http://docwiki.embarcadero.com/RADStudio/XE6/en/Nested_Type_Declarations]。 - TLama
@TLama,我记得我看到过。虽然这不是我喜欢做的事情,但它应该能够完成问题所要求的功能。内部类是私有的,对吧? - Graymatter
这要看情况。你可以将其设置为public并使用TMyClass.TPublicInnerClass。但我认为这样做没有任何好处。顺便说一下,如果你想符合问题中的原始字段FXYZ,应该重复使用strict private而不是var - TLama
非常感谢您提供的解决方案!我之前还不知道有嵌套类,只在Java中了解过。但是为什么“strict private var”与对类型和成员重复使用“strict private”不同呢?可见性真的不同吗? - Daniel Marschall
varstrict private是完全不同的东西,它们不能被比较。前者引入了一系列变量,而后者指定了随后声明的可见性。 - David Heffernan
这个评论串中存在很多混淆,似乎varstrict private是可替代的,二者选一。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接