Форум: "Основная";
Текущий архив: 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.007 c