Форум: "Основная";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
ВнизКлассы и интерфейсы Найти похожие ветки
← →
Sectey (2003-07-14 10:18) [0]Как проверить является ли данный объект "потомком" от данного интерфейса. Прошу прощение за каламбур.
Разкрываю вопрос.
Type
IC = interface
...
end;
TA = class
...
end;
TB = class(TB)
...
end;
TD = class(TB,IC)
end;
.........
procedure AAA(a : TA);
begin
// Здесь я имею объект базового класс TA
// Как мне проверить яв-ся ли объект "а" порождением от интерфейса IC ?
// Определять яв-ся ли объект "а" классом TD или TB принципиально нет неоходимости.
end;
Заранее всем благодарен
← →
MBo (2003-07-14 10:22) [1]QueryInterface
Supports
← →
Skier (2003-07-14 10:28) [2]procedure GetIC(const AComponent : TComponent; out AResult : IC);
begin
AResult := nil;
if Assigned(AComponent) then
AComponent.QueryInterface(IC, AResult);
end;
← →
Skier (2003-07-14 10:33) [3]И (по возможности) наследуйся от TInterfacedObject
← →
Sectey (2003-07-14 10:36) [4]>Skier ©
т.е. TComponent является как бы не явным потомком от IUnknown?
Если немного путаюсь в терменах прошу прощение.
← →
Skier (2003-07-14 10:42) [5]>Sectey © (14.07.03 10:36)
"Потомком" точно нет ! :)
Дело в том что TComponent поддерживает след. методы :
- запрос на поддержку интерфейса QueryInterface
- методы для подсчёта ссылок
И всё эти методы можно перекрывать в потомках
А что касается "встроенной" поддержки IUnknown, то я уже
писал - TInterfacedObject.
TInterfacedObject = class(TObject, IUnknown)
← →
Sectey (2003-07-14 10:49) [6]>Skier ©
Да я понял большое спасибо.
С теорией я разбирался довно, а вот до практики все не доходило.
← →
Skier (2003-07-14 10:55) [7]>Sectey © (14.07.03 10:49)
Ещё добавлю малость :)
Если тебе нужно чтобы ссылки на интерфейс считались, то код
подсчёта ссылок можешь взять из VCL из класса TInterfacedObject,
если нет то пиши, в качестве возвращаемого результата функций,
_AddRef и _Release : -1
← →
Fantasist. (2003-07-15 02:32) [8]
>Если тебе нужно чтобы ссылки на интерфейс считались, то код
>подсчёта ссылок можешь взять из VCL из класса TInterfacedObject
У TObject есть метод GetInterface. Если не нужно управлять жизнью объекта через интрефейсные ссылки, то он вполне подойдет.
← →
Набережных С. (2003-07-15 17:02) [9]>Fantasist. (15.07.03 02:32)
> У TObject есть метод GetInterface. Если не нужно управлять жизнью объекта через интрефейсные ссылки, то он вполне подойдет.
Что ты имеешь в виду? Имхо, никак не связано
← →
Serginio (2003-07-15 17:22) [10]Практика QueryInterface скоро уйдет в небытие. Для приведения класса к интерфейсу используй
AResult:=AComponent as IC; что эквивалентно OleCheck(AComponent.QueryInterface(IC, AResult)); Правда никогда не использовал IS.
На пороге Delphi.Net и такой синтаксис приведения класса к интерфейсу именно через As.
← →
Skier (2003-07-15 17:25) [11]>Serginio (15.07.03 17:22)
> Практика QueryInterface скоро уйдет в небытие.
И что придёт ? Exception ?
← →
Serginio (2003-07-15 17:29) [12]Уважаемый Skier © я не разу не пробовал IS, но существуют еще и Try
← →
Набережных С. (2003-07-15 18:43) [13]>Serginio (15.07.03 17:22)
>Практика QueryInterface скоро уйдет в небытие.
Все там будем:)
Конструкция AS не просто эквивалентна, она раскрывается компилятором в вызов QueryInterface с генерацией исключения при ошибке(процедура _IntfCast). И "Практика QueryInterface" никуда не денется, пока существуют интерфейсы. А тот факт, что ее вызов скрыт за какими-то конструкциями языка или обернут в функции более высокого уровня в сути дела ничего не меняет.
Допустимо также прямое присваивания:
Interface:=Object
что приводит к вызову _IntfCopy, а проверка поддержки интерфейса объектом происходит на этапе компиляции.
Serginio (15.07.03 17:29)
Оператор IS вообще не применим к интерфейсам, если я ничего не пропустил:)
← →
Serginio (2003-07-15 19:09) [14]Я бы уточнил пока используются СОМ интерфейсы. IS не применима к интерфейсам. В Net если объект не поддерживает интерфейс конструкция AS возвращается Nil.
← →
Набережных С. (2003-07-15 19:44) [15]>Serginio (15.07.03 19:09)
Интерфейс есть интерфейс, хоть в СОМ, хоть вне его. И IUnknown - база.
>В Net если объект не поддерживает интерфейс конструкция AS возвращается Nil.
Так ведь речь идет о Delphi...
← →
Serginio (2003-07-15 19:54) [16]А разве такого понятия как Delphi.Net не существует. Да и M$ открещивается от COM. Я просто веду речь о том, что лучше использовать дельфевые конструкции при работе с СОМ объектами.
А сама концепция Net мне очень нравится. И Delphi в нее вписывается как никакой другой язык. Если же будет еще и расширение то .....
← →
Набережных С. (2003-07-15 20:08) [17]Delphi.Net, конечно, существует. Но в вопросе указана вполне конкретная версия.
>Я просто веду речь о том, что лучше использовать дельфевые конструкции при работе с СОМ объектами.
А я вот не считаю, что это лучше или хуже. Всему свое время и всему свое место - давно сказано.
← →
Набережных С. (2003-07-15 20:11) [18]>Да и M$ открещивается от COM.
Боюсь, ты что-то не совсем точно понял:)
← →
Skier (2003-07-15 20:13) [19]>Serginio (15.07.03 19:54)
> Да и M$ открещивается от COM.
А как же тогда объяснить появление понятия COM+ ?
← →
vuk (2003-07-15 20:22) [20]to Skier:
>А как же тогда объяснить появление понятия COM+ ?
Дык это ж не технология, а всего лишь дополнительные сервисы основанные на той же самой технологии...
← →
Serginio (2003-07-15 20:24) [21]Они говорят, что СОМ уже мертвая технология хотя и поддерживаемая. И все силы брошены на Net объекты которой через маршалинг сами могут использовать СОМ, а также и сами объекты NEt могут выступать как СОМ объекты. Но это только на переходном периоде.
Как то на досуге решил посмотреть как Delphi реализует VMT интерфейса конкретного класса. В итоге строится VMT на заглушки для каждого экземпляра класса для передачи Self и вызова конкретного метода. Не знаю на сколько это эффективно.
Net технология очень мощная и языково независимо, А если учесть, что главным идеолгом стоит Хелсберг (создатель Delphi и турбо паскаля)
← →
Skier (2003-07-15 20:26) [22]>vuk © (15.07.03 20:22)
Дык я знаю. Я поэтому и пишу, что если "M$ открещивается от COM",
то как же объяснить дополнения к этому самому COM...
Кстати, в дополнения входят продукты Microsoft : MTS и MMQ
← →
vuk (2003-07-15 20:32) [23]to Skier:
>Дык я знаю.
Звиняюсь, не так понял фразу. Бывает. :o)
← →
Serginio (2003-07-15 20:34) [24]Skier © (15.07.03 20:13)
Да СОМ+ сколько уже лет. И сделан он для старых операционок как заплата для надежности. Net набирает ход и уже в этом году появятся бетта операционки для поддержки Юкон. Да и Windows API никогда меня не вдохновляла. Следует новый виток эволюции программирования.
← →
vuk (2003-07-15 20:39) [25]to Serginio:
>Следует новый виток эволюции программирования.
Где-то это я уже слышал. Кажется из уст Sun... :o)
← →
Skier (2003-07-15 20:39) [26]>Serginio (15.07.03 20:34)
> Да СОМ+ сколько уже лет
Если правильно помню то примерно 4-5
> Следует новый виток эволюции программирования.
Это-то конечно.
Только не надо забывать что дядя Билл он хитрый...:)
Например, Microsoft хотела отказаться от MDI, и что...ничего не
вышло.
Жизнь всё покажет...:)
← →
Serginio (2003-07-15 20:48) [27]Вот что сказал Дэвид Чаппел (эксперт M$) по поводу Net Enterprise Servises.
"Это не только обертка,но и надстройка СОМ+. Скорее всего СОМ+ сольется с Remoting и получится какая-то новая единая технология."
Онже.
У СОМ никакого будущего нет
← →
Skier (2003-07-15 20:51) [28]>Serginio (15.07.03 20:48)
Ну...может быть и так, но (sic !) следует так же обратить
внимание на оборот "Скорее всего", она показывает что уверенности
нет.
← →
Skier (2003-07-15 20:52) [29]...он показывает...:)
← →
Набережных С. (2003-07-15 20:54) [30]Вполне возможно, что я ошибаюсь, но, мне кажется, что подобного рода заявления - в большей степени маркетинговый ход. Кстати, мне ни разу не приходилось встречать подобные заявления за подписью официальных представителея фирмы. У кого-нибудь есть ссылки? И заявления о том, что NET позиционируется как "гробовщик" других платформ я тоже как-то не встречал. Хотя, повторюсь, вполне возможно, что я отстал от жизни:)
Конечно, COM не идеальна и недостатков в ней достаточно. Но то-же самое можно сказать о ЛЮБОЙ технологии. ИМХО, разумеется.
>Serginio (15.07.03 20:34)
>Да СОМ+ сколько уже лет.
Не так уж много:)
>И сделан он для старых операционок как заплата для надежности
А это, извини, совсем уж бред:) Хотя я и не в восторге от COM+
← →
Serginio (2003-07-15 20:55) [31]2(vuk © (15.07.03 20:39)) Ну надоже опередили. Вот так всегда. Но ведь это правда. Тем более конкуренция. А то с тоской вспоминаешь времена ДВК-2 и дос (и уже забыл как назывались большие ЭВМ, Фортран).
← →
Набережных С. (2003-07-15 20:55) [32]Впрочем, мы довольно далеко ушли от QueryInterface:)
← →
Skier (2003-07-15 21:02) [33]>Набережных С. © (15.07.03 20:55)
"Нам не дано предугадать как слово наше отзовётся" :)
← →
Набережных С. (2003-07-15 21:05) [34]>Skier © (15.07.03 21:02)
:)))
← →
Serginio (2003-07-15 21:09) [35]2(Набережных С. © ) Ты не совсем прав. Да действительно Net гробовщик и они это прямо заявляют. Вот достаточно старое интервью с Хэлсбергом
http://www.gotdotnet.ru/default.aspx?s=doc&d_no=32&c_no=10
Продвигается ЛонгХорн. Просто в отличии от предыдущих ходов M$ Net они продвигают очень осторожно, но настойчиво. А насчет СОМ+ (у меня с ним мало опыта по этому действительно могу городить бред), может я чегото не понимаю, то это некоторое развитие MTS и расширение сервисов, надстроек безопасности именно под w2k.
← →
Набережных С. (2003-07-15 21:53) [36]>Serginio (15.07.03 21:09)
За ссылку спасибо, но это интервью я читал. Весьма давно, поэтому сейчас бегло освежил. И как-то у меня не вытекает из него такой вывод. Напротив, указывается, что большим плюсом NET является высокая совместимость с существующими технологиями и системами. В общем, поживем - увидим:)
СОМ+ - расширение, развитие, упрощение использования "средним программистом"(кто-нибудь знает, кто это такой?), но уж никак не заплата.
← →
Serginio (2003-07-15 22:12) [37]Извиняюсь не правильно выразился насчет заплата. Это расширение.
А вывод делается на кроме других высказываний в том что сделан упор на компиляцию в зависимости от железа в том числе и операционки (чем так гордятся линуксоиды). Так называемый "Ад DLL", тоесть упор на сборки. Прежде всего надежность которая существует в управляемом коде (хотя и не дает расправить плечи).
На прощание всетаки приведу достаточно дипломатичные слова Хейлсберга каксаемые данного топика.
Джон: О каком переносе на платформу, в инфраструктуре которой нет поддержки COM объектов, может идти речь?
Хейлсберг: Это действительно возможно. COM вообще не нужен для стандартизации C# или CLI. C# имеет модель классов, которая богата сама по себе, а COM это всего лишь один из взглядов на то, как приложения могут взаимодействовать. Но ничего в основах C# или CLI не говорится о том, что это должен быть COM, GUID, HRESULT, Addref или Release. Ничего подобного. Общая среда выполнения .NET полностью исключает это. Но дает прекрасную возможность взаимодействия посредством COM, о котором я буду всегда думать как об очень важной особенности, по причинам ранее указанным. Но вовсе не необходимой.
Большое Спасибо за Внимание.
Время покажет кто Прав. Но я пока не Вышел Delphi.Net c удовольствием изучаю C#. Думаю пригодится. А зарабатываю 1С.
← →
vuk (2003-07-15 23:12) [38]to Serginio:
>Ну надоже опередили.
Вы так и не поняли? Тогда объясняю. Когда Sun породила Java, то было много разговоров с их стороны, что скоро все будут либо писать на Java либо компилировать в Java байткод. Ни того ни другого не как-то произошло. Революция не с случилась. Просто стало больше на одну технологию, которую стоит иметь в виду.
Теперь все ровно то же самое слышно от Microsoft, только технология называется иначе, по сути различий не так уж и много. И почему-то есть ощущение, что революции тоже не последует...
Кстати...
http://prikol.hut.ru/1/1-56.html
:o)
← →
MalkoLinge (2003-07-16 00:47) [39]
> Skier © (14.07.03 10:33)
> И (по возможности) наследуйся от TInterfacedObject
Да ну :))
А как же TaggregatedObject, TComponent и еще некоторые классы, которые реализуют IUnknown ? а если не от таких классов наследоваться, то вообще ничего в плане реализации интерфейсов не выйдет, если IUnknown руками не реализовывать ....
← →
Fantasist. (2003-07-16 02:37) [40]
> Набережных С. © (15.07.03 17:02)
> >Fantasist. (15.07.03 02:32)
> > У TObject есть метод GetInterface. Если не нужно управлять
> жизнью объекта через интрефейсные ссылки, то он вполне подойдет.
>
> Что ты имеешь в виду? Имхо, никак не связано
Да, не прав был. Мне почему-то казалось, что AddRef вызывается в реализации QueryInterface, а не в GetInterface.
> Кстати...
> http://prikol.hut.ru/1/1-56.html
> :o)
:) Ну это довольно старая статейка. Хотя большое спасибо, ибо здесь ( http://prikol.hut.ru/1/1-57.html) совершенно случайно нашел статейку которую искал давно.
> если IUnknown руками не реализовывать ....
Это почему? COM в делфи можно реализовать не используя Делфийский interface вообще. :)
Разделяю мнение, что COM скорее всего будет отмирать. Система типов в .NET предоставляет куда более обширные, надежные (э-хех) и удобные средства. По этому поводу был ряд статей. Не сомненно, что на данном этапе хорошая совместимость .NET с COM технологиями очень важна, поэтому этот факт и подчеркивается.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.01 c