Программирование - это просто
Advertisement
Главная arrow Уроки Delphi arrow Пишем на Delphi с применением COM-технологий arrow Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 
26.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Программирование COM в Delphi. Урок 2. Понятие об интерфейсах  Печать E-mail
Автор megabax   
30.07.2011 г.
New Page 1

Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 

Исходники к уроку можно скачать здесь..

Интерфейсы появились в Delphi начиная с версии 3. На них строиться вся технология программирования под COM. Однако, интерфейсами можно пользоваться и без COM. Иными словами, интерфейсы, это самостоятельная технология, которая может быть применена для программирования COM-приложения, так и для приложений, никак не связанных с COM. Поэтому изучение COM мы начнем с интерфейсов.

Что же такое интерфейс? По своей сути, он чем то похож на абстрактный класс. В Delphi можно объявить классы, для которых не все методы будут реализованы. Их предполагается реализовать в классах-потомках. Вот пример объявления абстрактного класса:

  TMyDriver=class(TObject)

    function Receiv:string; virtual; abstract;

    procedure Send(s:string); virtual; abstract;

  end;

Мы можем создать экземпляр абстрактного класса (то есть, следующий код компилятор вполне пропустит):

procedure TfrmIntfAndAbstractClasses.btnCreateAbstractClick(Sender: TObject);

var a:TMyDriver;

begin

  a:=TMyDriver.Create;

end;

он выдаст лишь предупреждения:

[Pascal Warning] IntfAbsCl.pas(35): W1020 Constructing instance of 'TMyDriver' containing abstract method 'TMyDriver.Receiv'

[Pascal Warning] IntfAbsCl.pas(35): W1020 Constructing instance of 'TMyDriver' containing abstract method 'TMyDriver.Send'

Даже если мы выполним этот код, ошибки не будет:

Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 

Но стоит нам только попытается использовать этот объект:

procedure TfrmIntfAndAbstractClasses.btnUseAbstractClassClick(Sender: TObject);

var a:TMyDriver;

begin

  a:=TMyDriver.Create;

  a.Send('Proba');

end;

и у нас "выскочит" сообщение об ошибке:

Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 

Иными словами, мы не можем использовать абстрактный класс. Нам надо объявить от него потомка, а так же реализовать у него все методы:

TFirstDriver=class(TMyDriver)

   function Receiv:string; override;

   procedure Send(s:string); override;

end;

 

function TFirstDriver.Receiv:string;

begin

   result:='First driver receive text';

end;

 

procedure TFirstDriver.Send(s: string);

begin

  MessageDlg(s,mtInformation,[mbOk],0);

end;

Класс TFirstDriver мы можем смело использовать:

procedure TfrmIntfAndAbstractClasses.btnUseFirstClassClick(Sender: TObject);

var a:TFirstDriver;

begin

  a:=TFirstDriver.Create;

  lbFirstDriverReceiv.Caption:=a.Receiv;

  a.Send('Proba');

end;

Данный код нормально отработает:

Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 

Возникает вопрос, а для чего нужны эти самые абстрактные классы? Дело в том, что мы можем объявить переменную именем родительского класса, а присвоить ему объект дочернего класса. Тоесть, вот такой вот код:

procedure TfrmIntfAndAbstractClasses.btnDemoParentVariableClick(Sender: TObject);

var a:TMyDriver;

begin

  a:=TFirstDriver.Create;

  lbDemoParantVariable.Caption:=a.Receiv;

  a.Send('Proba');

end;

будет вполне корректен:

Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 

И эта особенность Delphi, то что можно присвоить переменной объект дочернего класса незаменима в том случае, если мы заранее не знаем, какой класс будем использовать. Например, это зависит от выбор пользователя.  В этом случае мы для этих классов можем объявить общего абстрактного предка и использовать переменную его типа. Давайте проиллюстрируем это на примере. Сначала объявим еще один класс, дочерний от TMyDriver:

TSecondDriver=class(TMyDriver)

   function Receiv:string; override;

   procedure Send(s:string); override;

end;

 

function TSecondDriver.Receiv:string;

begin

   result:='Second driver receive text';

end;

 

procedure TSecondDriver.Send(s: string);

begin

  MessageDlg('This is second driver: '+s,mtInformation,[mbOk],0);

end;

А теперь напишем пример использования в зависимости от выбора пользователя:

procedure TfrmIntfAndAbstractClasses.btnDemoUseAbstractClassClick(Sender: TObject);

var a:TMyDriver;

begin

   if rbFirstDriver.Checked then a:=TFirstDriver.Create else a:=TSecondDriver.Create;

   lbDemoUseAbstractClass.Caption:=a.Receiv;

   a.Send('Proba');

end;

Программирование COM в Delphi. Урок 2. Понятие об интерфейсах 

А вот теперь мы плавно переходим к понятию "Интерфейс". И так, чем же он отличается от абстрактного класса? Во первых, интерфейс объявляется ключевым словом interface, например так:

  IMyDriver=interface

    function Receiv:string;

    procedure Send(s:string);

  end;

Далее, объявляемые интерфейсы прямо или косвенно наследуют IUnknown, который является предком всех интерфейсов с COM. Но о нем пойдет речь в будущих уроках. А пока я опишу следующие отличия интерфейса и абстрактного класса. И так, третье отличие: нельзя создать экземпляр интерфейса. То есть, вот такой код компилятор не пропустит:

procedure TfrmIntrafaces.btnCreateInterfaceClick(Sender: TObject);

var a:IMyDriver;

begin

    a:=IMyDriver.Create;

end;

Эта особенность интерфейса способствует сохранению безопасности программ при работе в сети.

Следующее отличие - нельзя использовать директивы области видимости. Все методы интерфейса имеют область видимости public. Так же в интерфейсе нельзя объявлять переменные.

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

Исходники к уроку можно скачать здесь..

(C) Шуравин Александр 

Последнее обновление ( 04.09.2013 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги