ego666
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Кстати, это похоже на баг компилятора, ибо если чётко указать, какой интерфейс-наследник объект реализует, а-ля ..то всё работает. | Это не баг, просто многие новички наступают на эти грабли (грабли наподобие тех, когда эти же новички пытаются одновременно работать и объектом и с его интерфейсами). Код: List := IFileList(TFileList.Create); | Это неверная запись для получения интерфейса из объекта. При неявном касте используется статическая проверка, а т.к. IFileList является наследником IList, то компилятор считает данное выражение верным (а то что это работает и указатель на vmt корректно определился - просто совпадение). Оно и верно - работает полиморфизм, только применять его нужно там, где он именно нужен (для чего он предназначен). Добавлено: А вот для получения интерфейса из объекта действуют другие правила, полиморфизм к ним не применим (он и не нужен и не предназначен для этого). Код: List := TFileList.Create as IFileList; | Такая запись верная, её и следует применять. При явном касте уже будет использоваться динамическая проверка, на предмет поддержки указанного типа интерфейса. Добавлено: Цитата: Если схема работы IFileList не совместима с использованием IList - то зачем декларировать наследование интерфейса? | Я так захотел. Я так могу. Это правильно. Потому что я хочу унаследовать все методы IList, унаследовать так сказать "контракт" на поддержку этих методов в дальнейшем, в наследниках и классах их реализующих. Зачем мне заниматься копи-пастом, вводя новый интерфейс с точно такими же методами? Почему я не могу просто их унаследовать? Это же повторное использование, чёрт возьми! Добавлено: Цитата: А если по вашему наследование интерфейса - это когда каждый потомок полностью переопределяет всю логику работы базового интерфейса, то нафига такое наследование вообще нужно? | Не всегда, а в конкретной исключительной ситуации. В обычной ситуации мы пишем базовый интерфейс, пишем реализующий его класс, потом пишем наследника интерфейса, наследуемся от предыдущего класса и реализовываем в нём новый интерфейс и т.д. и т.п. и в таком случае любой наследник класса будет поддерживать любой родительский интерфейс (читай без нужды явного его указания в классе). Добавлено: А вообще, возможность явно указывать или не указывать поддержку интерфейса - даёт разработчику большие возможности (выше уже кто-то приводил пример с поддержкой 100500 интерфейсов, без явного указания в классе, путём переопределения QueryInterface). Добавлено: Цитата: Ну вот уже интереснее. Тогда встречный вопрос - а зачем ВООБЩЕ нужно наследование в интерфейсах? | Выше уже писал - полиморфизм, но к получению интерфейса из объекта - это не относится. Добавлено: Цитата: Мы кагбэ не про COM говорим, а про интерфейсы Дельфи. | Когда я говорю о COM - я говорю конкретно об его архитектуре интерфейсов, которые в принципе не завися от платформы, где они могут быть реализованы (будь то Delphi или Windows). Добавлено: Цитата: А в Оксигене у интерфейса могут быть property и event | в интерфейсах Delphi тоже могут быть проперти, если что. | Всего записей: 77 | Зарегистр. 14-06-2013 | Отправлено: 09:35 20-06-2013 | Исправлено: ego666, 09:35 20-06-2013 |
|