为什么属性默认值在 free pascal 中不起作用?

ava*_*sin 3 freepascal

我想要默认的 http 错误代码 500。

我不能覆盖构造函数(我找到了一些关于它的文档,但编译器说There is no method in an ancestor class to be overridden: "constructor HttpError.Create(const AnsiString);

我试图添加Default 500到状态属性定义,但它也不起作用(我看到 0)。

500默认情况下,我如何为状态实现价值?

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

program test;

uses
  SysUtils;

Type
  {:Base http exception}
  HttpError = class(Exception)
  private
    FStatus: Integer;
  published
    property Status: Integer Read FStatus Write FStatus Default 500;
  end;

begin
  try
    Raise HttpError.Create('Ooops');
  except
    on e: HttpError do
      WriteLn(e.Status);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

500*_*ror 6

显然Default不会做你期望的事情。

实际上Default用于非常具体的事情,即向表单流系统指示此已发布(表单流)属性的默认值(在本例中)为 500,因此,如果该值不会改变,该值不需要与表单数据一起保存。

请注意 - 有点令人困惑 - 即使在Default使用属性的组件流上下文中,像您在此处所做的那样声明默认值实际上并没有设置字段的默认值 - 您必须在构造函数中手动执行此操作。

最后,override如果它在基类中是虚拟的,那么您只有一个构造函数,而该Exception类型的构造函数不是。只需将其声明为普通构造函数并在其中调用适当的祖先inherited... Create(...

虚拟构造函数主要用于响应从表单文件中解析数据而完成构造的组件。