Наследование интерфейсов и поддержка [duplicate]

$player->SayHi();

Я предпочитаю эту форму.

10
задан David Heffernan 15 May 2018 в 08:01
поделиться

1 ответ

Это может показаться немного интуитивно понятным, но ваш класс должен заявить, что он также реализует родительский интерфейс. Ваше объявление класса должно быть таким:

TMyObj = class(TInterfacedObject, IMyBase, IMyIntf)

Дэнни Торп, бывший инженер Borland, объяснил обоснование этого поведения в ответе на соответствующий вопрос :

Если класс реализации не объявляет, что он поддерживает наследуемый интерфейс, то класс не будет присвоить совместимость с переменными унаследованного интерфейса. Выбранный вами образец кода должен работать нормально (с использованием интерфейса IChild), но если вы попытаетесь назначить из экземпляра TMyClass переменную IParent, то у вас возникнут проблемы.

Причина в том, что потому что COM и ActiveX позволяют реализации реализовать интерфейс потомства (ваш IChild), но запрещают предок этого интерфейса (IParent). Поскольку интерфейсы Delphi предназначены для совместимости с COM, вот откуда этот дурацкий артефакт.

10
ответ дан HeartWare 15 August 2018 в 15:47
поделиться
  • 1
    И нет такой директивы компилятора, о которой Дэнни думал, что она может существовать. – Rudy Velthuis 15 May 2018 в 12:37
Другие вопросы по тегам:

Похожие вопросы: