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

标签 delphi

我有一个我想保持私有(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/

相关文章:

windows - CGI DLL(Delphi内置)物理路径

c# - 在 C# 中使用在 Delphi 7 中编译的 DLL

c++ - 在 delphi/pascal 中使用 C++ 接口(interface)

android - iOS/Android 与 Delphi/C# 桌面应用程序同步

web-services - 如何在delphi SOAP服务器中获取客户端mac地址?

delphi - 如何使用带有字符串索引的属性?

delphi - 删除问号

delphi - 从二进制文件中删除字符

delphi - 如何获取TRichViewEdit单词坐标?

xml - Delphi 跨平台应用程序中 XML 文件的哪个库?