Совместимость интерфейсов

Совместимость интерфейсов подчиняется определенным правилам. Если интерфейс создан расширением уже существующего интерфейса:

type
  IExtendedTextReader = interface(ITextReader)
    ...
  end;

то интерфейсной переменной базового типа может быть присвоено значение интерфейсной переменной производного типа:

var
  Reader: ITextReader;
  ExtReader: IExtendedTextReader;
begin
  ...
  Reader := ExtReader; // Правильно
  ...
end;

Но не наоборот:

ExtReader := Reader; // Ошибка!

Правило совместимости интерфейсов чаще всего применяется при передаче параметров в процедуры и функции. Например, если процедура работает с переменными типа ITextReader,

procedure LoadFrom(const R: ITextReader); 

то ей можно передать переменную типа IExtendedTextReader:

LoadFrom(ExtReader);

Заметим, что любая интерфейсная переменная совместима с типом данных IInterface - прародителем всех интерфейсов.

 

Яндекс цитирования