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

Why property default value does not work in free pascal?

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

我无法覆盖构造函数(我找到了 some docs about it,但编译器说 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.

显然 Default 没有达到您的预期。

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

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

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

在其中调用适当的祖先

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