Re[17]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 23.11.10 16:51
Оценка:
Здравствуйте, Mamut, Вы писали:

M> С чего это вдруг они будут являться пшиком? Интерфейсы — не более, чем реализация множественного наследования в языках, где множественного наследования нет (например, в Delphi). При чем тут COM'овские методы?


Вот-вот, я и говорю, нифига ты не понимаешь... QueryInterface страшная сила, если начать думать, а не повторять зазубренные формулировки.
avalon 1.0rc3 rev 366, zlib 1.2.3
Re[17]: Интерфейсы Delphi грязный хак.
От: lazy_walrus  
Дата: 23.11.10 16:58
Оценка:
Здравствуйте, Mamut, Вы писали:

_>>Это в С++. Интерфейсы Delphi не являются абстрактными классами. Если тебе нужен абстрактный класс — сделай абстрактный класс, никто не мешает. Безо всяких IUnknown.


M>Дело в том, что в Delphi нет множественного наследования, и интерфейсы — это единственный способ задать разное поведение обхекту. Тольков от облом — это поведение будет гвоздями прибито к DOM'у.


Компилятор Delphi неявно вызывает AddRef и Release при работе с интерфейсами. Без QueryInterface для простых внутренних интерфейсов можно обойтись, а AddRef и Release должны быть обязательно как-то реализованы. Собственно и всё.
Re[14]: Интерфейсы Delphi грязный хак.
От: MxMsk Португалия  
Дата: 23.11.10 17:30
Оценка:
Здравствуйте, hattab, Вы писали:

MM>> H>Я уже сказал, что эту темя для себя закрыл. Ты можешь найти ответ если перечитаешь написанное ранее.

MM>> Ты написал, что речь идет о какой-то там "нативности". Так вот я и не пойму: что ты вкладываешь в это понятие?
H>Менеджед и натив различаешь? Это оно.
Вроде приводили в пример С++. Вроде нативный язык. Не?

MM>> Также был вопрос: что мешает компилятору самому генерить эти три метода?

H>Вопрос зачем? Иногда бывает выгодно самому релизить некоторые из этих методов, преинтересные вещи делать удается, доложу я вам (см. RIO.TRIO.QueryInterface и как там формируются интерфейсные таблицы для поддержки SOAP).
Еще раз повторю. Затем, что мне эти методы не нужны. Их нет в моем контракте. Пофиг мне, что с ними кто-то может делать интересные вещи. Мне они зачем, м?
Re[18]: Интерфейсы Delphi грязный хак.
От: MxMsk Португалия  
Дата: 23.11.10 17:31
Оценка:
Здравствуйте, lazy_walrus, Вы писали:

_>>>И спорящий с тобой правильно делает — в Delphi жизнь TObject'ов никак не управляется. Единственный способ, с помощью которого в Delphi можно например реализовать RAII — это интерфейсы работающие через подсчёт ссылок.

MM>>Вот это интересно. Т.е. теперь оказывается, что интерфейсы в Delphi введены для RAII?
_>С какого перепоя такое умозаключение?
Выделил. Но скажу сразу, что я почему-то пропустил слово "например". Если RAII был просто примером, то ладно.
Re[18]: Интерфейсы Delphi грязный хак.
От: MxMsk Португалия  
Дата: 23.11.10 17:35
Оценка: +1
Здравствуйте, hattab, Вы писали:

H>Вот-вот, я и говорю, нифига ты не понимаешь... QueryInterface страшная сила, если начать думать, а не повторять зазубренные формулировки.

Слушай, у тебя, что не ответ Мамуту, то попытка оскорбить. Может сбавишь обороты, а?
Re[19]: Интерфейсы Delphi грязный хак.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.11.10 17:46
Оценка: :)
Здравствуйте, MxMsk, Вы писали:

H>>Вот-вот, я и говорю, нифига ты не понимаешь... QueryInterface страшная сила, если начать думать, а не повторять зазубренные формулировки.

MM>Слушай, у тебя, что не ответ Мамуту, то попытка оскорбить. Может сбавишь обороты, а?

Он просто не может найти нужный аргумент ни на хоботе, ни на хабре, потому повторяет чьи то фразы.
Re[18]: Интерфейсы Delphi грязный хак.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.11.10 17:48
Оценка:
Здравствуйте, hattab, Вы писали:

M>> С чего это вдруг они будут являться пшиком? Интерфейсы — не более, чем реализация множественного наследования в языках, где множественного наследования нет (например, в Delphi). При чем тут COM'овские методы?


H>Вот-вот, я и говорю, нифига ты не понимаешь... QueryInterface страшная сила, если начать думать, а не повторять зазубренные формулировки.


Нет там ничего страшного. Упрощенный до предела бинарный стандарт.
Re[19]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 23.11.10 18:44
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM> Слушай, у тебя, что не ответ Мамуту, то попытка оскорбить. Может сбавишь обороты, а?


А тебя коим боком задевает? Это мое личное дело, тем более, что есть за что Что-то ты к Мамуту не лезешь, когда он Шеридана поливает. Искатель справедливости, мля
avalon 1.0rc3 rev 366, zlib 1.2.3
Re[20]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 23.11.10 18:44
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I> MM>Слушай, у тебя, что не ответ Мамуту, то попытка оскорбить. Может сбавишь обороты, а?


I> Он просто не может найти нужный аргумент ни на хоботе, ни на хабре, потому повторяет чьи то фразы.


Смотри не лопни, толстячок
avalon 1.0rc3 rev 366, zlib 1.2.3
Re[19]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 23.11.10 18:44
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I> M>> С чего это вдруг они будут являться пшиком? Интерфейсы — не более, чем реализация множественного наследования в языках, где множественного наследования нет (например, в Delphi). При чем тут COM'овские методы?


I> H>Вот-вот, я и говорю, нифига ты не понимаешь... QueryInterface страшная сила, если начать думать, а не повторять зазубренные формулировки.


I> Нет там ничего страшного. Упрощенный до предела бинарный стандарт.


Выделил
avalon 1.0rc3 rev 366, zlib 1.2.3
Re[15]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 23.11.10 18:44
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM> H>Менеджед и натив различаешь? Это оно.


MM> Вроде приводили в пример С++. Вроде нативный язык. Не?


Ты в курсе, что C++ это еще не вся нативная среда? О взаимодействии подумай. Ну я же об этом писал уже, ну?

MM> MM>> Также был вопрос: что мешает компилятору самому генерить эти три метода?


MM> H>Вопрос зачем? Иногда бывает выгодно самому релизить некоторые из этих методов, преинтересные вещи делать удается, доложу я вам (см. RIO.TRIO.QueryInterface и как там формируются интерфейсные таблицы для поддержки SOAP).


MM> Еще раз повторю. Затем, что мне эти методы не нужны. Их нет в моем контракте. Пофиг мне, что с ними кто-то может делать интересные вещи. Мне они зачем, м?


Не нужны — не реализуй Выбери предка с реализацией или делегируй. Тоже мне проблема
avalon 1.0rc3 rev 366, zlib 1.2.3
Re[20]: Интерфейсы Delphi грязный хак.
От: Antikrot  
Дата: 23.11.10 18:53
Оценка: :))
Здравствуйте, hattab, Вы писали:

MM>> Слушай, у тебя, что не ответ Мамуту, то попытка оскорбить. Может сбавишь обороты, а?

H>Что-то ты к Мамуту не лезешь, когда он Шеридана поливает.
им можно. я так вообще серьёзно думаю, что они в жаббере договариваются кто кого где и как ссаными тряпками гонять будет.
Re[21]: Интерфейсы Delphi грязный хак.
От: MxMsk Португалия  
Дата: 23.11.10 19:25
Оценка:
Здравствуйте, Antikrot, Вы писали:

MM>>> Слушай, у тебя, что не ответ Мамуту, то попытка оскорбить. Может сбавишь обороты, а?

H>>Что-то ты к Мамуту не лезешь, когда он Шеридана поливает.
A>им можно. я так вообще серьёзно думаю, что они в жаббере договариваются кто кого где и как ссаными тряпками гонять будет.
Ты святой
Re[18]: Интерфейсы Delphi грязный хак.
От: Mamut Швеция http://dmitriid.com
Дата: 24.11.10 07:51
Оценка:
_>>>Это в С++. Интерфейсы Delphi не являются абстрактными классами. Если тебе нужен абстрактный класс — сделай абстрактный класс, никто не мешает. Безо всяких IUnknown.

M>>Дело в том, что в Delphi нет множественного наследования, и интерфейсы — это единственный способ задать разное поведение обхекту. Тольков от облом — это поведение будет гвоздями прибито к DOM'у.


_>Компилятор Delphi неявно вызывает AddRef и Release при работе с интерфейсами.


Зачем?

_>Без QueryInterface для простых внутренних интерфейсов можно обойтись, а AddRef и Release должны быть обязательно как-то реализованы.


С чего это вдруг «обязательно»?


dmitriid.comGitHubLinkedIn
Re[18]: Интерфейсы Delphi грязный хак.
От: Mamut Швеция http://dmitriid.com
Дата: 24.11.10 07:52
Оценка: :)
M>> С чего это вдруг они будут являться пшиком? Интерфейсы — не более, чем реализация множественного наследования в языках, где множественного наследования нет (например, в Delphi). При чем тут COM'овские методы?

H>Вот-вот, я и говорю, нифига ты не понимаешь... QueryInterface страшная сила, если начать думать, а не повторять зазубренные формулировки.


При чем тут QueryInterface к множественному наследованию? Правильно, оно к нему вообще никакого отношения не имеет. Оно имеет отношение только к COM'у


dmitriid.comGitHubLinkedIn
Re: Интерфейсы Delphi грязный хак.
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.12.10 11:06
Оценка: 1 (1)
Здравствуйте, Mamut, Вы писали:


M>Это грязный хак для работы с COM-ом. Не знаю, как сейчас, но в Delphi не было не-COM интерфейсов.

По-моему, это вполне себе чистый хак для работы с COM-ом.
Такой реализацией Хейльсберг дал возможность использовать ком-объекты в Дельфи без ручного подсчёта ссылок и пользования QueryInterface.

Какие у него были варианты?
1. Сделать два типа интерфейсов: унаследованные от IUnknown и все остальные. Компилятор отслеживает поведение IUnknown-based, автоматически подсчитывая ссылки и преобразуя приведение типов к QueryInterface. Для "обычных" интерфейсов он этого не делает.
Такая политика может приводить к трудноуловимым глюкам в тех случаях, когда класс реализует сразу несколько интерфейсов. Получается, разные ссылки на этот объект будут вести себя по-разному. Вот мы сохраняем ссылку на "обычный" интерфейс. Как знать, вдруг за ней скрывается объект с поддержкой IUnknown? Проверять ли это и подсчитывать ли ссылки?
Как делать приведения к интерфейсу? Вот мы приводим "обычный" интерфейс к IUnknown-based. Возможно, он реализован через агрегацию, которая встроена в язык. Стало быть, обычный каст даст неверный результат — нужно лезть в QueryInterface.

В общем, что-то не клеится такая автоматика. Получаем переусложнение на ровном месте, и паранойю компилятора во всех местах использования интерфейсов типа "а вдруг там сзади COM?"

2. Сделать ровно один тип интерфейсов. IUnknown — такой же, как и все; никакой магии нет. Получается, для банальной работы с ком-объектами нужно везде руками писать AddRef/Release/QueryInterface. Постоянно помнить о том, что приведение типов через каст может работать-работать, а потом вдруг перестать — если реализация данного конкретного интерфейса изменилась на агрегацию.
Работать — работает, но как-то грубо по отношению к девелоперам. Это примерно то же, что и поддержка COM в чистом C: реализовать можно, но помощи от компилятора нет.

3. Принудительно сделать все интерфейсы ком-совместимыми. В итоге за счёт весьма небольшой цены (фактически, припиливания 4х байт к каждому объекту, реализующему хоть какой-то интерфейс) имеем очень хорошую поддержку как разработки COM-классов, так и использования; при этом компилятор достаточно прямолинеен и предсказуем.

На всякий случай напомню, что дедушка Хейльсберг знаменит как раз тем, что он специализируется на написании кода для пользы, а не для красоты. Его задачей была не абстрактная реализация красивой идеи интерфейсов, а облегчение жизни виндовс-девелоперам. Ну как в C# 3.0 была задача "сделать лёгким взаимодействие с СУБД", так и в Дельфи ставилась задача "сделать лёгким взаимодействие с COM". Тогда это было более важным.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Интерфейсы Delphi грязный хак.
От: Ночной Смотрящий Россия  
Дата: 17.12.10 23:12
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Какие у него были варианты?

S>1. Сделать два типа интерфейсов: унаследованные от IUnknown и все остальные. Компилятор отслеживает поведение IUnknown-based, автоматически подсчитывая ссылки и преобразуя приведение типов к QueryInterface. Для "обычных" интерфейсов он этого не делает.
S>Такая политика может приводить к трудноуловимым глюкам в тех случаях, когда класс реализует сразу несколько интерфейсов. Получается, разные ссылки на этот объект будут вести себя по-разному. Вот мы сохраняем ссылку на "обычный" интерфейс. Как знать, вдруг за ней скрывается объект с поддержкой IUnknown? Проверять ли это и подсчитывать ли ссылки?
S>Как делать приведения к интерфейсу? Вот мы приводим "обычный" интерфейс к IUnknown-based. Возможно, он реализован через агрегацию, которая встроена в язык. Стало быть, обычный каст даст неверный результат — нужно лезть в QueryInterface.

S>В общем, что-то не клеится такая автоматика. Получаем переусложнение на ровном месте, и паранойю компилятора во всех местах использования интерфейсов типа "а вдруг там сзади COM?"


S>2. Сделать ровно один тип интерфейсов. IUnknown — такой же, как и все; никакой магии нет. Получается, для банальной работы с ком-объектами нужно везде руками писать AddRef/Release/QueryInterface. Постоянно помнить о том, что приведение типов через каст может работать-работать, а потом вдруг перестать — если реализация данного конкретного интерфейса изменилась на агрегацию.

S>Работать — работает, но как-то грубо по отношению к девелоперам. Это примерно то же, что и поддержка COM в чистом C: реализовать можно, но помощи от компилятора нет.

S>3. Принудительно сделать все интерфейсы ком-совместимыми. В итоге за счёт весьма небольшой цены (фактически, припиливания 4х байт к каждому объекту, реализующему хоть какой-то интерфейс) имеем очень хорошую поддержку как разработки COM-классов, так и использования; при этом компилятор достаточно прямолинеен и предсказуем.


4. Сделать все интерфейсы простыми, без магии, а для магии добавить отдельную фичу языка, позволяющую делать автодеструкцию, причем не только для интерфейсов, а универсально.
И Хейлсберг сотоварищи, кстати, знаменит еще и тем, что вместо прибивания гвоздями к основному языку SQL, как это делали многие до него, он придумал куда как более генерализованный LINQ. Который сейчас используется вообще без БД в огромном количестве мест. И интерфейсы в Дельфи так и остались в основном средством СОМ интеропа.
Re[8]: Интерфейсы Delphi грязный хак.
От: Ночной Смотрящий Россия  
Дата: 17.12.10 23:33
Оценка:
Здравствуйте, hattab, Вы писали:

H>Несмотря на то, что IMyIntf наследуется от IInterface (IUnknown), сам он не является COM-интерфейсом т.к. не имеет собственного GUID'а.


GUID нужен для регистрации интерфейса и работы через QueryInterface. Однако QI не единственный способ получения ссылки на стаб интерфейса. Вполне работает в СОМ куда более банальный вариант:
interface IGuidIface
{
  INoGuidIface Get();
  // Или даже так
  IUnknown MyQueryInterface(string ifaceName);
}
Re[9]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 18.12.10 00:12
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС> GUID нужен для регистрации интерфейса и работы через QueryInterface. Однако QI не единственный способ получения ссылки на стаб интерфейса. Вполне работает в СОМ куда более банальный вариант:

НС>
НС> interface IGuidIface
НС> {
НС>   INoGuidIface Get();
НС>   // Или даже так
НС>   IUnknown MyQueryInterface(string ifaceName);
НС> }
НС>


Только это будет уже не COM-интерфейс. Я ведь уже приводил цитату из PSDK:

COM interfaces are strongly typed. Every interface has its own interface identifier (a GUID), which eliminates the possibility of duplication that could occur with any other naming scheme.

avalon 1.0rc3 rev 368, zlib 1.2.3
Re[3]: Интерфейсы Delphi грязный хак.
От: hattab  
Дата: 18.12.10 00:23
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС> И интерфейсы в Дельфи так и остались в основном средством СОМ интеропа.


С чего это вдруг? В VCL полно мест где используются интерфейсы, и интеропом с COM там даже не пахнет.
avalon 1.0rc3 rev 368, zlib 1.2.3
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.