如果未设置对象中的某个属性,我希望能够创建编译器错误/警告。假设我有以下课程:
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
属性,以便在未设置事件时发出编译器错误/警告?
答案 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
过程。如果他没有,将发出编译器警告。