Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.200.210.43] |
|
Страницы: (495) « Первая ... 493 494 [495] ( Перейти к последнему сообщению ) |
Сообщ.
#7411
,
|
|
|
Цитата Qraizer @ Почему ручная делегация не затрагивает унаследованный от базового интерфейса метод расширяющего интерфейса? Потому, что она "придумана" не просто для возможности "алиасинга имен" интерфейсного и реализующего метода, а как раз для задания различных\индивидуальных реализаций для одноименных методов разных интерфейсов - не важно, связанных между собой "родственными узами" или нет. Поэтому делегация IMyInterface.Handle = ...; относится только к реализации указанного интерфейса IMyInterface и ни к какому другому (ни к наследнику, ни к предку). Поэтому если ты по каким-то причинам хочешь использовать другое имя реализующего метода, то нужно делегировать его всем реализуемым интерфейсам TMyObject = class(TInterfacedObject, IMyInterface, IMyInterface2) protected procedure _Handle; procedure IMyInterface.Handle = _Handle; procedure IMyInterface2.Handle = _Handle; //тут можно задать и другой реализующий метод end; Цитата Qraizer @ если IMyInterface2 расширяет IMyInterface, то IMyInterface.Handle в равной мере принадлежит обоим интерфейсам Цитата Qraizer @ Я понимаю так, что расширение – это создание нового на основе существующего, при этом новый включает в себя из него всё. Вопрос в том, что "включает" и что "в равной мере принадлежит". Расширение\наследование интерфейса означает наследование деклараций методов и последовательность расположения их адресов в vmt\vtable. Однако то, что унаследованный IMyInterface2 не добавляет новых методов к IMyInterface, не означает, что при реализации этих интерфейсов одним объектом они непременно должны ссылаться на одну и ту же (разделяемую) vmt - это могут быть две разные vmt, идентичные по содержанию. И как было сказано выше, использование делегирования метода как раз и подразумевает, что один и тот же метод может иметь разные реализации у предка и наследника, и соотв-но они 100% будут иметь разные vmt. Поэтому в том, что "один и тот же интерфейс IMyInterface, будучи в TMyObject доступным по двум маршрутам, ... присутствует в двух экземплярах", ничего удивительного нет, т.к. во-первых, мы сами этого "захотели", используя делегирование, во-вторых, это "не запрещено законом" |
Сообщ.
#7412
,
|
|
|
Это я уже всё понял, leo. Спасибо, однако, я ожидал от Shaggy подтверждения. Другими словами, в Плюсах это само собой разумеющиеся поведение, ибо по дефолту абстрактные классы, каковые мы используем в качестве интерфейсов, не наследуются виртуально, тогда как в Дельфи дефолтовое поведение интерфейсов как раз обратное. Прикол-то как раз в том, что что интерфейсы, что абстрактные классы для реализации одних и тех же парадигм в обоих языках подходят одинаково, тогда как когда мы допытывались у них, как они собираются реализовывать отдельные реализации одного и того же интерфейса, если вдруг понадобится, в ответ было либо "такого никогда не нужно", либо приводился пример с отдельными реализациями в разных классах, с последующим агрегированием и делегированием, что вообще-то больше на подпорку похоже. Вот мне и интересно, почему нам сразу не показали, что делегированием можно управлять и на уровне интерфейсов, а не только реализаций.
Добавлено Впрочем, возможно и показывали. Я уходил из темы, когда тут начали лить воду по десятку страниц в час. |