Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-100681
uhhax
2003-07-18 04:51
2003.07.31
Почему прога так много ест памяти?


14-100985
LiLa Ananda
2003-07-16 08:29
2003.07.31
Делитесь ли вы проблемами?


11-100658
Arhangel
2002-11-28 22:45
2003.07.31
Народ, что я не так делаю?


14-100969
VEG
2003-07-15 18:19
2003.07.31
Проблема с STL. Можно ли не вводить лишнюю пременную???


14-100954
abc
2003-07-15 14:26
2003.07.31
что за EhGrid такой?? где его можно качнуть??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский