Совместимость интерфейсов подчиняется определенным правилам. Если интерфейс создан расширением уже существующего интерфейса:
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 - прародителем всех интерфейсов.