为什么在Free Pascal中属性默认值不起作用?

3
我希望默认的http错误代码为500。
我无法覆盖构造函数(我已经找到了一些文档,但编译器说“祖先类中没有要被覆盖的方法:“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.
1个回答

6

显然,Default并不是你期望的那样起作用。

实际上,Default被用于一个非常具体的目的,即指示表单流系统此发布(流式传输)属性具有默认值(在本例中为500),因此如果该值未从此更改,则不需要将该值保存到表单数据中。

请注意-有点令人困惑-即使在组件流式传输上下文中使用Default属性声明默认值,也不会实际上设置字段的默认值-您必须在构造函数中手动设置。

最后,只有在基类中构造函数是虚拟的时候,才会override一个构造函数,而Exception类型的构造函数不是虚拟的。只需将其声明为普通构造函数,并使用inherited...Create(...在其中调用适当的祖先即可。

虚拟构造函数主要用于组件,其中的构造是针对从表单文件解析数据进行的。


此外,这个属性没有必要被“发布”,“公共”的话也可以做同样的事情 - 甚至你可能不需要它。 - LeRookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接