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