Почему не вызывается потомковая версия метода абстрактного базового класса? - PullRequest
3 голосов
/ 15 декабря 2011

Я пытаюсь создать простой класс THistory, который имеет одну процедуру, которая принимает абстрактный базовый класс, который реализует простой интерфейс.

Приведенный ниже код компилируется, но класс THistory вызывает базовый класс HistoryRecords абстрактной процедуры вставки вместо передаваемой в подклассы вставки процедуры.Чего мне не хватает?

Спасибо за помощь!

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;

Ответы [ 2 ]

8 голосов
/ 15 декабря 2011

Вы пропустили переопределение :

TAlarmHistoryRecord = class(THistoryRecord)
  procedure Insert(); override;
end;
6 голосов
/ 15 декабря 2011

В объявлении метода TAlarmHistoryRecord отсутствует директива override, т.е. она должна быть

procedure Insert(); override;

На самом деле компилятор должен предупредить вас, что метод скрывает унаследованный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...