Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.07;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
4-19932
Radimir
2003-02-07 13:27
2003.04.07
Очистка памяти


3-19444
Ihtiandr
2003-03-18 13:11
2003.04.07
Exel


8-19699
nomshar
2002-12-31 01:24
2003.04.07
Масштабирование изображений


3-19433
off
2003-03-18 14:30
2003.04.07
В IB есть такая приблуда


14-19755
Rollch
2003-03-21 23:10
2003.04.07
Как убрать корзину с рабочего стола (XP)