delphi中的变体记录

use*_*512 3 delphi delphi-2010

我只是想学习变体记录,有人可以解释一下如何检查记录中的形状是矩形还是三角形等,或者有可用的实现示例吗?我在这里检查了变体记录,但是没有可用的实现。

type
    TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
    TFigure = record
    case TShapeList of
      Rectangle: (Height, Width: Real);
      Triangle: (Side1, Side2, Angle: Real);
      Circle: (Radius: Real);
      Ellipse, Other: ();
   end;
Run Code Online (Sandbox Code Playgroud)

Uli*_*rdt 5

您必须为形状添加一个字段,如下所示:

type
    TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
    TFigure = record
    case Shape: TShapeList of
      Rectangle: (Height, Width: Real);
      Triangle: (Side1, Side2, Angle: Real);
      Circle: (Radius: Real);
      Ellipse, Other: ();
   end;
Run Code Online (Sandbox Code Playgroud)

注意该Shape字段。

还要注意,这并不意味着Delphi会进行任何自动检查-您必须自己进行检查。例如,您可以将所有字段设为私有,并仅允许通过属性进行访问。在他们的getter / setter方法中,您可以Shape根据需要分配和检查字段。这是一个草图:

type
  TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);

  TFigureImpl = record
    case Shape: TShapeList of
      Rectangle: (Height, Width: Real);
      Triangle: (Side1, Side2, Angle: Real);
      Circle: (Radius: Real);
      Ellipse, Other: ();
  end;

  TFigure = record
  strict private
    FImpl: TFigureImpl;

    function GetHeight: Real;
    procedure SetHeight(const Value: Real);
  public
    property Shape: TShapeList read FImpl.Shape;
    property Height: Real read GetHeight write SetHeight;
    // ... more properties
  end;

{ TFigure }

function TFigure.GetHeight: Real;
begin
  Assert(FImpl.Shape = Rectangle); // Checking shape
  Result := FImpl.Height;
end;

procedure TFigure.SetHeight(const Value: Real);
begin
  FImpl.Shape := Rectangle; // Setting shape
  FImpl.Height := Value;
end;
Run Code Online (Sandbox Code Playgroud)

我将记录分为两种类型,因为否则编译器将不会接受所需的可见性说明符。另外,我认为它更具可读性,并且GExperts代码格式化程序不会对此造成干扰。:-)

现在类似这样的东西会违反一个断言:

procedure Test;
var
  f: TFigure;
begin
  f.Height := 10;
  Writeln(f.Radius);
end;
Run Code Online (Sandbox Code Playgroud)