11

在 C# 中我可以通过base关键字访问基类,而在 java 中我可以通过super关键字访问它。如何在德尔福中做到这一点?假设我有以下代码:

  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;
4

3 回答 3

14

您收到 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;
于 2012-09-20T03:36:42.000 回答
11

你应该使用inherited关键字:

procedure TForm3._setCaption(Value: String); 
begin 
  inherited Caption := Value;
end;
于 2012-09-20T03:43:48.863 回答
3

基础 (C#) = 超级 (java) = 继承 (Object Pascal) (*)

3 个关键字的工作方式相同。

1) 调用基类构造函数
2) 调用基类方法
3) 为基类属性赋值(假设它们不是私有的,只允许受保护的和公共的)
4) 调用基类析构函数(仅限 Object Pascal。C# 和 Java 没有t有析构函数)


(*) Object Pascal 比 Delphi 或 Free Pascal 更可取,因为 Object Pascal 是程序语言的名称,而 Delphi 和 Free Pascal 是 Object Pascal 的编译器。

于 2013-10-04T12:52:04.503 回答