隐藏在Delphi中的嵌套记录信息

时间:2010-02-20 19:03:27

标签: delphi oop records

我有一个相对复杂的数据结构来建模。我想用Delphi中的记录结构来做这个,结构很复杂,足以证明将它拆分成嵌套记录是正确的。一个简化的例子:

    type
      TVertAngle = record
      strict private
        fDecDegrees: Double;
        fDegrees: integer;
        fMinutes: integer;
        fDeciSeconds: integer;
        function GetAngle: Double;
        function GetRadians: Double;
      public
        Valid: Boolean;
        procedure SetAsString(const Value: string; const AngleType: TInfoUnits);
        property DecDegrees: Double read GetAngle;
        property Radians: Double read GetRadians;
      end;

~~~~ other sub record declarations ~~~~~~

  TDataRecord = record
  strict private
    fHorzDistance: Double;
    fLeicaData: TRawMessageData;
    fUpdateTime: TDateTime;
    function DecodeGsi8(GsiWord: string): TGSiWord;
    function DecodeGsi16(GsiWord: string): TGSiWord;
  public
    GsiWord: TGSiWord;
    Valid: Boolean;
    InputMode: TDataModes;
    HorzAngle: THorzAngle;
    VertAngle: TVertAngle;
    HorzRange: TDistance;
    SlopeRange: TDistance;
    PrismOffset: TConstants;
~~~~ other sub record instances~~~~~~
    function SetMessage(RawMessage: string): Boolean;
~~~~ more stuff ~~~~~~

我目前在单元的Interface部分声明了所有这些。我更喜欢只有主记录结构对使用该单元的任何东西都可见,并且目前所有子记录也是可见的。如果我将记录声明移动到Implementation部分,那么我会遇到编译器错误。我如何进行重组,以便在主记录之前声明子记录但子记录未发布?

2 个答案:

答案 0 :(得分:6)

您可以执行以下操作之一:

1)在单独的“子单元”中声明“子记录”,因此只有在“使用”子句中声明“子单元”时,“子记录”类型才可用。这并不是你想要的,因为“子记录”可以对其他单位可见,但它提供了一定程度的隐藏,因为必须明确声明“子单位”以达到“子记录”定义。 / p>

2)将“子记录”声明为私有嵌套类型,如下所示:

type
  TMainRec = record
    private type
      TSubRec = record
        FSubField: Integer;
        procedure SubMethod;
      end;
    private
      FSubRec: TSubRec;
  end;

implementation

{ TMainRec.TSubRec }

procedure TMainRec.TSubRec.SubMethod;
begin
...
end;

答案 1 :(得分:1)

你不能这样做,因为即使信息不需要直接用于设备外的其他代码,编译器仍然需要知道子记录类型,如果你打算使用主要记录。

您可以尝试的一件事是在另一个单元中声明其他类型,然后在其他地方不使用其他单元。但是,这并没有真正解决问题;它隐藏了一点。