На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 493 494 [495]   ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C#, ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата Qraizer @
    Почему ручная делегация не затрагивает унаследованный от базового интерфейса метод расширяющего интерфейса?

    Потому, что она "придумана" не просто для возможности "алиасинга имен" интерфейсного и реализующего метода, а как раз для задания различных\индивидуальных реализаций для одноименных методов разных интерфейсов - не важно, связанных между собой "родственными узами" или нет. Поэтому делегация IMyInterface.Handle = ...; относится только к реализации указанного интерфейса IMyInterface и ни к какому другому (ни к наследнику, ни к предку). Поэтому если ты по каким-то причинам хочешь использовать другое имя реализующего метода, то нужно делегировать его всем реализуемым интерфейсам
    ExpandedWrap disabled
      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 доступным по двум маршрутам, ... присутствует в двух экземплярах", ничего удивительного нет, т.к. во-первых, мы сами этого "захотели", используя делегирование, во-вторых, это "не запрещено законом" :)
      Это я уже всё понял, leo. Спасибо, однако, я ожидал от Shaggy подтверждения. Другими словами, в Плюсах это само собой разумеющиеся поведение, ибо по дефолту абстрактные классы, каковые мы используем в качестве интерфейсов, не наследуются виртуально, тогда как в Дельфи дефолтовое поведение интерфейсов как раз обратное. Прикол-то как раз в том, что что интерфейсы, что абстрактные классы для реализации одних и тех же парадигм в обоих языках подходят одинаково, тогда как когда мы допытывались у них, как они собираются реализовывать отдельные реализации одного и того же интерфейса, если вдруг понадобится, в ответ было либо "такого никогда не нужно", либо приводился пример с отдельными реализациями в разных классах, с последующим агрегированием и делегированием, что вообще-то больше на подпорку похоже. Вот мне и интересно, почему нам сразу не показали, что делегированием можно управлять и на уровне интерфейсов, а не только реализаций.

      Добавлено
      Впрочем, возможно и показывали. Я уходил из темы, когда тут начали лить воду по десятку страниц в час.
      Одни с годами умнеют, другие становятся старше.
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:
      Страницы: (495) « Первая ... 493 494 [495] 


      Рейтинг@Mail.ru
      [ Script Execution time: 0,4879 ]   [ 14 queries used ]   [ Generated: 11.12.19, 21:12 GMT ]