Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

Интерфейсы   Найти похожие ветки 

 
Alex134   (2003-07-13 18:49) [0]

Объясните пожалуйста зачем они нужны, можно на примере. Читаю две книжки и не могу понять самой сути, там только и написано как их объявлять, про три основных метода, короче фигня всякая.


 
Ihor Osov'yak   (2003-07-13 21:30) [1]

COM без них невозможен. Но их можно использовать не только в контексте COM.

Зы - позволю себе ниже фрагмент одной статьи - может чего и прояснит:

COM - это есть во первых, некий набор не нарушаемых ни при каких условиях правил, согласно которым одни программные объекты могут воспользоваться ресурсами других программных обьектов, а также средства операционной системы, которые обеспечивают это взаимодействие. Причем те объекты, которые используют ресурсы (далее клиенты), никогда не получают полного контроля над объектами, которые эти ресурсы отдают (далее - компоненты, или объекты COM)... Мало того, клиенту даже не обязательно иметь представление об общем устройстве объекта COM. Для их взаимодействия важно наличие оговоренного интерфейса взаимодействия и гарантии того, что этот интерфейс никогда не будет изменен.
Здесь под интерфейсом понимается набор определенных методов, которые должны быть реализованы объектом COM, и которые "предоставляются" клиенту. На уровне бинарного кода за интерфейсом стоит некая структура в памяти, которую реализует объект COM и которая предоставляет собой некую таблицу адресов методов обьекта COM. Когда говорят, что клиент получил интерфейс, то понимают, что ему стал известен адрес той структуры. Кроме того, клиент "знает", в каком порядке идут точки вхождения в этой таблице для соответствующих методов, так как клиент знаком с соответствующей спецификацией.
...
Подытоживая, можно сказать,что интерфейс есть спецификация, которая на на уровне бинарного кода "отражается" в таблицу вызовов в памяти.
..
В СОМ интерфейсы - это все. Для клиента сервер представляет собой набор интерфейсов. Клиент с сервером может взаимодействовать только посредством интерфейсов. Мало того, клиент даже может не знать о всех интерфейсах, поддерживаемых сервером.
Все интерфейсы наследуются от базового интерфейса IUnnknown . Причем, если говорят о наследовании интерфейсов, то понимают не наследование реализации (с ней мы имеем дело, когда работаем в пределах объектной модели хотя бы того же Delphi), а наследование деклараций. Под наследованием деклараций понимается то, что если некий интерфейс IB наследуется от интерфейса IA, то в соответствующей таблице вызовов для интерфейса IB сначала будут идти адреса методов, которые декларируются в IA, а затем адреса методов от IB. Причем списки формальных параметров наследуемых методов не должны быть изменены. Если вспомнить, что интерфейсы есть спецификации, то становится понятным, почему по отношению к ним может идти речь только о наследовании деклараций. Конечно, при реализации конкретного COM-обьекта можно использовать технологию наследования реализации, но это будет внутреннее дело объекта, которое никак не затрагивает клиента.

В завершение разговора об COM, я хотел бы упомянуть о некоторых методах базового интерфейса IUnnknown, так как во первых, эти методы присутствуют в любом интерфейсе (вспомним о наследовании деклараций и о том, что любой интерфейс наследуется от IUnnknown) и во вторых, на использовании этих методов строится вся идеология работы с COM.

Итак, разрешите представить - QueryInterface. С помощью этого интерфейса клиент может определить, поддерживает ли COM-обьектом какой либо другой интерфейс, который известен клиенту, и получить указатель на тот интерфейс, если он поддерживается объектом. При работе с СOM, это пожалуй самый популярный вызов. В Dеlphi он иногда вызывается явно, иногда неявно. Неявный вызов происходит при применении оператора as для интерфейсных ссылок.
Интерфейс IUnnknown также декларирует два метода интерфейса AddRef и Release, которые ответственны за подсчет использования COM-обьекта (одно из требований к COM-обьектам - они должны уметь сами себя уничтожить, если в их услугах более никто не нуждается). Вам вряд ли придется вызывать эти методы напрямую, так как Delphi генерирует их вызовы автоматически.



 
Ihor Osov'yak   (2003-07-13 23:25) [2]



То есть, работа с COM-обьектами идет только через интерфейсы. На эту тему есть куча литературы.

Есть еще менее очевидный момент. Использование интерфейсов помимо COM. Можно привести несколько примеров. Например, реализация обьектов с самоуничтожением. То есть, создаем обьект и работаем с ним исключительно по интерфейсной ссылке. Когда этот обьект становится ненужным, ссылка обнуляется, и как следствие, счетчик использований обьекта уменшается на единицу.. Если обьект больше нигде не используется, счетчик сбрасывается в 0 и обьект уничтожается.. Красиво, и главное - поддержка на уровне синтаксиса языка..
Второй пример. Есть много разнотипных обьектов. Все они имеют несколько одинаковых методов, и мы вынуждены работать с этими методами, независимо от типа обьекта.. Например, множество диалоговых оком, методы - putData, getData, Execute.. Предположим, их в принцыпе проблематично свести к одному предку, или нецелесообразно.. Не будем здесь рассуждать об изьяне в проектировании - возможно пример неудачный, но идею он иллюстрирует..
Так вот, мы можем продекларировать некий интерфейс, содержащий этих три метода, и научить эти диалоговые окна реализировать этот интерфейс.. И потом работать через этот интерфейс, не особо вникая, какой диалог мы дергаем за этот интерфейс..



 
Alex134   (2003-07-14 01:13) [3]

Теперь все стало ясно, большое спаибо !


 
Крот   (2003-07-14 08:11) [4]

http://www.clubpro.spb.ru/cominside/

Здесь очень хорошая рассылка по COM-технологиям, лучше всяких книжек, есть примеры на Delphi, очень рекомендую заглянуть.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.023 c
3-77738
Serval
2003-07-01 08:12
2003.07.24
Данные в отчет из БД


14-78116
Антонио
2003-07-08 15:56
2003.07.24
Ну народ, помогите, плиззз! Кто-нибудь знает, где найти компонент


14-78081
Kiril
2003-07-06 18:15
2003.07.24
С помощью чего можно получить HTML-код интернет-страницы...


3-77797
Sliften
2003-06-29 20:38
2003.07.24
Как програмно добавить поле


14-78134
Alexey
2003-07-09 10:20
2003.07.24
Web Server





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский