如果未设置属性,则生成编译器错误

时间:2016-09-13 14:59:26

标签: delphi firemonkey delphi-10-seattle

如果未设置对象中的某个属性,我希望能够创建编译器错误/警告。假设我有以下课程:

interface

type
  TBarkevent = procedure (Bark : String) of object;

  TDog = class
  private
    FOnBark : TBarkevent;
    procedure SetBark(const Value: TBarkevent);
    function GetBark: TBarkEvent;
  public
    procedure Bark;
    property OnBark : TBarkEvent read GetBark write SetBark;
    constructor Create;
  end;

implementation

{ TDog }

procedure TDog.Bark;
begin
  if Assigned(OnBark) then
    OnBark('Woof!')
end;

constructor TDog.Create;
begin
end;

function TDog.GetBark: TBarkEvent;
begin
  Result := FOnBark;
end;

procedure TDog.SetBark(const Value: TBarkevent);
begin
  FOnBark := Value;
end;

我在另一个单位中使用TDog类:

var
  Dog : TDog;
begin
  Dog := TDog.Create;
  Dog.OnBark := DogBark;
  Dog.Bark;

现在,一旦调用Bark()程序,就会触发OnBark事件。

我的问题:

是否可以使强制指定OnBark属性,以便在未设置事件时发出编译器错误/警告?

2 个答案:

答案 0 :(得分:5)

将您的班级定义为:

TDog = class
private
  FOnBark : TBarkevent;
  procedure SetBark(const Value: TBarkevent);
  function GetBark: TBarkEvent;
public
  procedure Bark;
  property OnBark : TBarkEvent read GetBark write SetBark;
  constructor Create(Bark : TBarkEvent);
end;

这样,您无需指定事件即可实例化TDog对象。如果您尝试,则会收到编译错误。

答案 1 :(得分:1)

首先:否。对于像这样的属性,无法在编译时检查此内容。

要使 几乎强制实现OnBark事件,您可以将其添加为构造函数参数,而不是将其作为读/写发布-属性。然后,在调用构造函数时,可以使用Assert()在运行时检查它是否已将有效的回调方法传递给构造函数。

要使 确实强制,您可以声明以下内容:

TCustomDog = class
public
  procedure Bark; virtual; abstract;
end;

因此,使用TCustomDog类的每个人都必须实现Bark过程。如果他没有,将发出编译器警告。