Інтерфейси в delphi
Наприклад, так може бути оголошений наступний інтерфейс:
Реалізувати інтерфейс можна тільки в класі:
TTint = class (TInterfacedObject, ITint) procedure MyMsg; procedure ITint.My_Msg = MyMsg; destructor Destroy; override; end;
Var Form1: TForm1; Tint: ITint; T: TTint; procedure TTint.MyMsg; begin MessageBox (0, 'Test', 'Повідомлення', 0); end;
destructor TTint.Destroy; begin inherited; MessageBox (0, 'Free', nil, 0); end;
Для створення інтерфейсу спочатку потрібно отримати об'єкт відповідного класу, застосувавши, наприклад, наступний код:
Або більш коротко: Tint: = TTint.Create as ITint; після цього можна викликати методи інтерфейсу: Tint.My_Msg;
Використання T.Free викличе помилку, оскільки клас буде звільнений тоді, коли відпаде необхідність з інтерфейсом.
Приєднання інтерфейсів до форм
За допомогою механізму інтерфейсів від різних програмних компонент можна домогтися однакової функціональності. Для цього достатньо реалізувати інтерфейс в компоненті, а в зухвалій модулі перевірити його наявність. У наступному прикладі інтерфейс описаний в окремому модулі, а розробляється клас форми успадковує і реалізує його:
unit Unit2; interface type IMessageInterface = interface [ ''] procedure Msg_Name; end;
У модулі форми клас TForm3 успадковує інтерфейс:
unit Unit3; interface type TForm3 = class (TForm, IMessageInterface) private procedure Msg_Name; end; var Form3: TForm3; implementation procedure TForm3.Msg_Name; begin ShowMessage ( 'Form3'); end;
Тепер ви можете телефонувати методів інтерфейсу з інших модулів, в яких видно форма Form3. Наприклад, одним помахом на кнопці в модулі Unit1 (Form1):
procedure TForm1.Button2Click (Sender: TObject); var IMI: IMessageInterface; begin if Assigned (Form3) and Form3.GetInterface (IMessageInterface, IMI) then IMI.Msg_Name; end;
Додавши цей інтерфейс до інших компонентів додатка, можна одноманітно викликати їх методи.
У наведеному прикладі можна було приєднати до форми не один, а кілька інтерфейсів і викликати ще й їхні методи. Крім цього, як і раніше залишаються доступними властивості і методи форми, успадковані від класу TForm. Але, на жаль, доступ до розробленого нами об'єкту-формі можливий тільки з того ж самого додатка, де цей об'єкт був створений.
об'єкти com
На відміну від випадку, розглянутого в попередньому прикладі, COM-об'єкт надає свою функціональність тільки за допомогою механізму інтерфейсів. Цим досягається універсальність в спілкуванні додатків-клієнтів з будь-якими COM-об'єктами.
Кожен об'єкт реалізований всередині деякого сервера: в динамічній бібліотеці; в окремому здійсненне додатку на тому ж комп'ютері; в віддаленому коді, що виконується на комп'ютері, відмінному від комп'ютера клієнта. Сервер містить код методів інтерфейсів об'єкта, а також дані об'єкта поки він активний. З точки зору клієнта об'єкт будь-якого сервера виглядає абсолютно однаково і доступ до його методам здійснюється через покажчики на інтерфейси.
Об'єкт зобов'язаний (інакше це не COM-об'єкт) мати інтерфейс IUnknown. в протокол якого входять три методи: QueryInterface - запит покажчика необхідного інтерфейсу, AddRef - збільшення лічильника посилань, Release - зменшення лічильника. Об'єкти підтримують лічильники посилань, щоб знати, коли можна завершити свою роботу (лічильник = 0 - об'єкт не має клієнтів). Всі інші інтерфейси є спадкоємцями IUnknown, а значить, маючи покажчик на будь-який інтерфейс об'єкта, клієнт може отримати точку входу в інший необхідний йому інтерфейс.
Кожен COM-об'єкт є екземпляром деякого класу, і кожен клас може мати GUID - ідентифікатор класу (CLSID). Він потрібен в основному для того, щоб бібліотека COM могла знайти необхідний сервер в базі об'єктів (реєстр) і створити екземпляр класу (об'єкт). Під класом, в даному випадку, розуміється конкретна реалізація деякого набору інтерфейсів. Зрозуміло, що різні класи можуть мати абсолютно однакові інтерфейси.
Більшість фірм не розробляють власні інтерфейси, а використовують існуючі. Наприклад, інтерфейс IDispatch призначений для автоматизації додатків.