Delphi - потомок TInterfaceList для поддержки большего количества типов - Абстрактная ошибка - PullRequest
0 голосов
/ 04 мая 2011

У меня есть класс TRow = class (TInterfaceList), в котором элементы, которые я хочу добавить, являются потомками IField (TFieldType1 и TFieldType2). У меня есть метод, в котором я хочу перебирать элементы и вызывать для них метод IField:

(Item[i] as IField).IFieldMethod

И я получаю абстрактную ошибку?Что я делаю неправильно?Я не прав в своем понимании ООП или Delphi?

Спасибо

1 Ответ

1 голос
/ 04 мая 2011

У вас есть класс, реализующий IField.IFieldMethod с использованием метода abstract virtual, и вы проигнорировали Constructing instance of <TType> containing abstract method <MethodName>.

Вот короткая демонстрационная программа с консольным кодом, демонстрирующая вашу ошибку.Тот факт, что вы звоните IFieldMethod с использованием (Item[i] as IField).IFieldMethod, не дает никакой новой информации, он только скрывает причину проблемы.Сохраните ссылку интерфейса типа IField на локальную переменную, и вы получите мой код:

program Project23;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes;

type IDummyIntf = interface
  procedure DoStuff;
end;

type TDummyImp = class(TInterfacedObject, IDummyIntf)
  procedure DoStuff;virtual;abstract; // TDummyImp implements IDummyIntf.DoStuff using a VIRTUAL ABSTRACT method.
end;

var X: IDummyIntf;
begin
  X := TDummyImp.Create; // <-- Warning at this line, Constructing instance of TDummyImp containing abstract method TDummyImp.DoStuff 
  X.DoStuff; // This raises EAbstractError because TDummyImp doesn't actually implement DoStuff
  ReadLn;
end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...