delphi - 为什么不调用抽象基类方法的后代版本?

标签 delphi interface abstract

我正在尝试创建一个简单的类 THistory,它有一个过程,该过程采用一个实现简单接口(interface)的抽象基类。

下面的代码可以编译,但是 THistory 类调用基类 HistoryRecords 抽象 Insert 过程,而不是传入的子类 Insert 过程。我错过了什么?

感谢您的帮助!

unit uHistory;

interface

uses Dialogs;

type

IHistoryRecord = interface
  ['{67C90064-1667-4DE0-AF52-11B6E5A00892}']
  procedure Insert();
end;

THistoryRecord = class abstract(TInterfacedObject, IHistoryRecord)
  procedure Insert(); virtual; abstract;
end;

THistory = class(TObject)
  public
  procedure Add(pHistoryRecord : THistoryRecord);
end;

TAlarmHistoryRecord = class(THistoryRecord)
  procedure Insert();
end;

implementation

{ THistory }

procedure THistory.Add(pHistoryRecord: THistoryRecord);
begin
  pHistoryRecord.Insert();
end;

{ TAlarmHistoryRecord }

procedure TAlarmHistoryRecord.Insert;
begin
  MessageDlg('Alarm History Record - Insert Method', mtInformation, [mbOK], 0);
end;

end.

Usage
procedure TForm1.Button1Click(Sender: TObject);
var
  lHistory : THistory;
  lHistoryRecord : TAlarmHistoryRecord;
begin

  lHistory := THistory.Create();

  lHistoryRecord := TAlarmHistoryRecord.Create();

  // I want this to call the TAlarmsHistoryRecord.Insert proc not the
  // HistoryRecord base class Insert proc.
  lHistory.Add(lHistoryRecord);

end;

最佳答案

您错过了覆盖:

TAlarmHistoryRecord = class(THistoryRecord)
  procedure Insert(); override;
end;

关于delphi - 为什么不调用抽象基类方法的后代版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522358/

相关文章:

delphi - 如何将IP地址的整数值转换为标准IP地址

delphi - 在 Delphi 中写入事件日志

delphi - 比较屏幕截图并获取第一个像素变化的屏幕坐标

xml - Delphi 中的 JSON 与 XML 解析速度

java - 多重继承或多接口(interface)

c++ - 如何丢弃 IUpdateSearcher::BeginSearch

Java图形paint方法执行流程

c++ - 如何使用抽象类型的私有(private)静态成员变量

typescript - 在 Typescript 中混入抽象基类

Java "extending"一个对象