Совместимость интерфейсов подчиняется определенным правилам. Если интерфейс создан расширением уже существующего интерфейса:
type IExtendedTextReader = interface(ITextReader) ... end; |
то интерфейсной переменной базового типа может быть присвоено значение интерфейсной переменной производного типа:
var Reader: ITextReader; ExtReader: IExtendedTextReader;begin ... Reader := ExtReader; // Правильно ...end; |
Но не наоборот:
ExtReader := Reader; // Ошибка! |
Правило совместимости интерфейсов чаще всего применяется при передаче параметров в процедуры и функции. Например, если процедура работает с переменными типа ITextReader,
procedure LoadFrom(const R: ITextReader); |
то ей можно передать переменную типа IExtendedTextReader:
Заметим, что любая интерфейсная переменная совместима с типом данных IInterface — прародителем всех интерфейсов.