gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:39:00 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的类 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com