(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Чистые интерфейсы в Delphi

Источник: gunsmoker
Hallvard Vassbotn

Чистые интерфейсы в Delphi

В комментарии к последнему посту Huseyn спросил:

В Delphi все интерфейсы являются наследниками IUnknown (или IInterface - Hallvard Vassbotn), но в мире C есть ещё более базовая сущность - интерфейсы, не являющиеся наследниками IUnknown. Я встретил такой интерфейс в одной DLL, которую мне надо было использовать. Но я не могу это сделать в Delphi.
Да, это верно, что в Delphi создание интерфейса всегда подразумевает неявное наследование от IUnknown или IInterface (два имени для отличий COM и Delphi интерфейсов). И это означает, что все интерфейсы в Delphi будут иметь три метода QueryInterface, _AddRef и _Release. Это, конечно, делает сложным (или невозможным) реализацию чистого интерфейса из не-COM DLL с использованием синтаксиса объявления интерфейсов в Delphi.

В далёкие тёмные времена Delphi 2, у нас не было явных интерфейсов, а поддержка COM строилась на том факте, что структура таблицы VMT совпадает с бинарным контрактом COM, а "интерфейсы" были объявлены с использованием полностью абстрактных классов. К примеру, именно так до сих пор интерфейсы объявляются в C++. Класс, который хочет реализовать такой "интерфейс", просто наследуется от чистого абстрактного класса, замещая и реализуя все его абстрактные методы. Это достаточно ограниченный способ написания интерфейсов; поскольку Delphi не поддерживает множественное наследование классов, то вы точно захотите уметь поддерживать множество интерфейсов - и тогда вам придётся писать по одному новому классу на каждый интерфейс и вручную писать метод QueryInterface, чтобы он возвращал корректную ссылку. В C++ нет ограничения на множественное наследование и, быть может, поэтому в C++ нет отдельной языковой конструкции для интерфейсов - по сравнению с языками вроде Java, Delphi и C#, которые имеют модель единственности наследования.

Этот небольшой урок истории должен дать нам подсказку о том, как мы можем избежать методов IUnknown обычных интерфейсов - мы можем просто объявить и реализовать чисто абстрактный класс.

К примеру:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
program TestPureInterface;
  
{$APPTYPE CONSOLE}
  
type
  TMyPureInterface = class
    procedure FirstMethod; stdcall; virtual; abstract; 
    procedure SecondMethod; stdcall; virtual; abstract; 
  end;
   
  TMyImplementation  = class(TMyPureInterface)
  public
    procedure FirstMethod; override; 
    procedure SecondMethod; override;
  end;
     
procedure TMyImplementation.FirstMethod;
begin
  Writeln('TMyImplementation.FirstMethod');
end;
   
procedure TMyImplementation.SecondMethod;
begin
  Writeln('TMyImplementation.SecondMethod');
end;
   
procedure TestClient(PureInterface: TMyPureInterface);
begin
  PureInterface.FirstMethod;
  PureInterface.SecondMethod;
end;  
   
var
  MyImplementation: TMyImplementation;
begin
  MyImplementation := TMyImplementation.Create;
  TestClient(MyImplementation);
  readln;
end.
Этот маленький пример кода сначала объявляет чистый абстрактный класс с виртуальными абстрактными методами. Это объявление не-COM интерфейса в стиле C++ для DLL из вопроса. Мы реализуем "интерфейс" созданием класса-наследника от этого базового полностью абстрактного класса, в котором реализуем все методы. Заметьте, что компилятор не требует повторно указывать соглашение вызова при замещении методов:
1
procedure FirstMethod; override;
И, наконец, я написал немного тестового кода, который осуществляет вызов реализованных методов через ссылку на "интерфейс". Это соответствует коду в DLL, для которой мы обеспечиваем реализацию интерфейсов.


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 02.08.2011 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Delphi Professional Named User
Enterprise Connectors (1 Year term)
Quest Software. TOAD Xpert Edition
IBM RATIONAL Clearcase Floating User From Rational Clearcase Lt Floating User Trade Up License + Sw Subscription & Support 12 Months
Stimulsoft Reports.Ultimate Single License Includes one year subscription, source code
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Компьютерный дизайн - Все графические редакторы
СУБД Oracle "с нуля"
Новые материалы
Вопросы и ответы по MS SQL Server
Один день системного администратора
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100