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

Вниз

Чем отличаются классы и интерфейсы?   Найти похожие ветки 

 
Bel   (2003-03-25 10:11) [0]

Собственно, вопрос чисто академический. Кое в чём я уже сам разобрался, но не до конца.
Из прочитанного в книгах, хэлпах и т. д. понятно, что класс может иметь представителей, а интерфейс нет. В классе могут быть поля, а в интерфейсе нет. В интерфейсе всё является public. И, наконец, к чему я всё это веду. В интерфейсе все методы только объявляются, а за их реализацию отвечает класс, который наследует интерфейс.
Рассмотреть можно на примере. Я использую компоненты из вкладки Servers для связи с Outlook"ом. Одна строчка кода:
NameSpace1.Folders.Item(i).Name
NameSpace1 - компонента типа TNameSpace = class (TOleServer). А TOleServer, в свою очередь, происходит от (TComponent, IUnknown).
Далее, свойство Folders возвращает тип _Folders = interface(IDispatch).
Его функция Item(i) возвращает MAPIFolder = interface(IDispatch).
Ну, а свойство Name уже имеет нормальный тип WideString.
И так далее. И так во всех компонентах: большинство свойств и функций возвращают какой-либо интерфейс. Но я нигде в модуле не нашёл реализацию методов этих интерфейсов. Более того, от этих интерфейсов никакой объект не происходит. Так где же находится реализация этих методов? Откуда берётся имя папки в вышеприведённом примере?
У меня есть предположение, что это как-то связано с GUID при объявлении интерфейса. Например,
MAPIFolder = interface(IDispatch)
["{00063006-0000-0000-C000-000000000046}"]
Мастера, просвятите пожалуйста. Или, может, кто-нибудь знает, где можно почитать на эту тему.


 
REA   (2003-03-25 10:16) [1]

На пальцах разница такая: интерфейсы одинаково описываются для всех языков программирования и компиляторов, а классы специфичны для каждого компилятора. Один класс может иметь много интерфейсов (условно таблиц вызова функций). Реализация интерфейсов находится в соответствующих библиотеках и не обязательно на том же компьютере.


 
Smithson   (2003-03-25 10:26) [2]

Интерфейс - это описание (декларирование) набора функций и переменных.
Class - это описание и реализация набора функий и переменных.

Плюс описание интерфейса стандартизированно в windows (про OLE слышал?), а классы каждый производитель клепает сам как может. Вот выйдет dotNet, njulf и классы тсндартизуются помалясь...


 
calm   (2003-03-25 10:33) [3]

По сути, указатель на интерфейс - это указатель на таблицу, элементы которой указывают на адреса методов (в delphi это VMT), реализующих интерфейс.


 
Bel   (2003-03-25 10:40) [4]

Так значит, реализация методов (которую я не нашёл) находится где-то снаружи, если я правильно понял. А где именно? Это как-то связано с GUID (см. выше), да?

> Smithson © (25.03.03 10:26)
> ... (про OLE слышал?)...


Именно поэтому вопрос и возник. Использую в работе OLE, а до конца смысла не понимаю.


 
calm   (2003-03-25 11:58) [5]

Да ты книжку какую-нибудь почитай.
Тема не самая простая, здесь тебе на пальцах не объяснят (долго).


 
Bel   (2003-03-25 12:16) [6]

Уже две книжки прочитал и хэлп почти весь облазил. Сюда затем и обратился, потому что найденной информации недостаточно. Думал, может кто-нибудь подскажет где почитать именно об этом, так как перелопачивать кучу книжек (где, большей частью, всё одно и то же) бессмысленно ради одного-двух абзацев именно того текста, который нужен.
А данная вами (всеми) информация немного упорядочила мои знания по этому вопросу, за что вам БОЛЬШОЕ СПАСИБО.
И, боюсь показаться слишком настырным, но всё-таки, ответьте на оставшийся вопрос насчёт GUID.


 
Smithson   (2003-03-25 12:32) [7]

Нет. GUID это фактически уникальный ключ в реестре, в котором написано, какую программу с какимим параметрами дергать при обращении к этому com-серверу (имя com-сервера там тоже написано). Основная его ценность - в уникальности, дабы не перетереть существующий чужой.

Реализация методов интерфеса находится всегда внутри объекта, реализующего интерфейс (реализации не наследуются).


 
Smithson   (2003-03-25 12:34) [8]

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


 
Вячеслав   (2003-03-25 12:38) [9]

А ГУИД собственно точно по определению и используется.
Интерфейсы разных серверов автоматизации вполне могут называться одинаково, но иеют разные ГУИДы
Знание этого самого ГУИДа гарантирует, что будет выбран тот, который нужен :)


 
Bel   (2003-03-25 13:47) [10]

> Smithson © (25.03.03 12:32)
> GUID это фактически уникальный ключ в реестре, в котором написано, какую программу с какимим параметрами дергать при обращении к этому com-серверу.

Кажется нашёл. В реестре под этим GUID есть ссылка на библиотеку типов msoutl9.olb. Наверное, именно там и находятся все реализации методов интерфейсов. А когда интерфейс объявляется, то по GUID в реестре находится эта библиотека и оттуда всё и берётся. Правильно я понял?


 
calm   (2003-03-25 15:13) [11]

В реестере написано, где реализован данный интерфейс. Это может быть DLL, может быть EXE, может быть и OCX.
OLB - это библиотека типов (type library), в которой в специальном формате изложено, какие методы с какими параметрами имеет данный интерфейс.



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

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

Наверх




Память: 0.47 MB
Время: 0.008 c
1-19679
любитель
2003-03-26 09:29
2003.04.07
Помогите разобраться с указателем на массив...


14-19822
kudatsky
2003-03-20 11:24
2003.04.07
Инстоляция D5 под Windows 2000


1-19562
zhlog
2003-03-26 20:17
2003.04.07
проблема с dll


14-19832
Bboy
2003-03-20 19:58
2003.04.07
Вопрос по Ворду


8-19710
Mihey
2003-01-04 00:01
2003.04.07
Глючит TDXTimer!





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