在C#中,我可以通过base
关键字访问基类,在java中,我可以通过super
关键字访问它。如何在delphi中做到这一点?
假设我有以下代码:
type
TForm3 = class(TForm)
private
procedure _setCaption(Value:String);
public
property Caption:string write _setCaption; //adding override here gives error
end;
implementation
procedure TForm3._setCaption(Value: String);
begin
Self.Caption := Value; //it gives stack overflow
end;
答案 0 :(得分:13)
您收到了stackoveflow异常,因为该行
Self.Caption := Value;
是递归的。
您可以访问父属性Caption
,将Self
属性转换为基类,如下所示:
procedure TForm3._setCaption(const Value: string);
begin
TForm(Self).Caption := Value;
end;
或使用inherited
关键字
procedure TForm3._setCaption(const Value: string);
begin
inherited Caption := Value;
end;
答案 1 :(得分:11)
您应该使用inherited
关键字:
procedure TForm3._setCaption(Value: String);
begin
inherited Caption := Value;
end;
答案 2 :(得分:2)
base(C#)= super(java)= inherited(Object Pascal)(*)
3个关键字的工作方式相同。
1)调用基类构造函数
2)调用基类方法
3)为基类属性赋值(假设它们不是私有的,只允许保护和公共)
4)调用基类析构函数(仅对象Pascal .C#和Java没有析构函数)
(*)Object Pascal优于Delphi或Free Pascal,因为Object Pascal是程序语言的名称,而Delphi和Free Pascal是Object Pascal的编译器。