Лекція №4 З курсу: «Застосування засобів ООП в лінгвістичних задачах»
4.2. Що таке метод?
Методи (Method) класу (процедури і функції, оголошення яких включено в опис класу) виконання деяких дій над об’єктами класу (то есть характеризує поведінку об’єтів). Для того щоб метод був виконаний, необхідно вказати імена об’єкту і методу, відокремивши одно ім’я від іншого точкою. Наприклад, інструкція
boss.ShowInfo;
викликають застосування метода ShowInfo до объекта boss. Фактично інструкція застосування методу до об’єкту - це специфічний спосіб запису інструкції виклику процедури. Методи класу визначаються в програмі так само, як і звичайні процедури і функції, за виключенням того, що ім’я процедури або функції, що є методом, складаються з двох частин: імені класу, якому належить метод, і імені метода. Ім’я класу від імені метода відокремлюється точкою. Нижче в лістінгу 4.2 наведений приклад визначення метода showinfo класу TPersonal.
Лістінг 4.2. Метод showinfo класса TPersonal procedure TPersonal.showinfo; begin // Вивід на екран даних про співробітника. Messagebox.Show(fname+' '+fage.toString); end;
Як видно з лістінга 4.2, в інструкціях метода доступ до полів об’єкта здійснюється без вказання імені об’єкта. Далі наведений приклад програми (лістінг 4.3), в якому оголошується клас TPersonal, над об’єктом якого (boss) виконуєть різні дії.
Лістінг 4.3 Приклад програми, що демонструє створення і використання класу unit WinForm; interface uses System.Drawing, System.Collections, System.ComponentModel, System.Windows.Forms, System.Data; type TWinForm = class(System.Windows.Forms.Form) {$REGION 'Designer Managed Code1} strict private Components: System.ComponentModel.Container; Butstonl: System.Windows.Forms.Button; procedure InitializeComponent; procedure Buttonl_Click(sender: System.Object; e: System.EventArgs); {$ENDREGION} strict protected procedure Dispose(Disposing: Boolean); override; private { Private Declarations } public constructor Create; end; // Оголошення класу. TPersonal = class private fname: string[30]; //Це поле класу – ім’я співробітника. fAge: byte; // Це поле класу - вік співробітника. public constructor Create; // Конструктор - створення нового об’єкту // (екземпляр класу). procedure showinfo; // Цей метод класу - показує // інформацію про співробітника.
procedure TWinForm.Dispose(Disposing: Boolean); begin if Disposing then begin if Components <> nil then Components.Dispose(); end; inherited Dispose(Disposing); end;
constructor TWinForm.Create; // Конструктор для форми. begin inherited Create; InitializeComponent; end;
// Процедура обробки подій Click на кнопці Button1. procedure TWinForm.Button1Click(sender: System.Object; e: System.EventArgs); var worker:TPersonal; begin // Створення нового об’єкта. worker:=TPersonal.Create; // Застосування метода до об’єкта - вивід інформації про співробітника. Worker.ShowInfо; // На екрані повідомлення 'Новий співробітник О'. // Зміна значення полів об’єкта worker.fname:='Шупрута Володимир';
worker.fage:=25; //Застосування методу до об’єктау-вивід інформації про співробітника. worker.showinfо; // На екрані повідомлення 'Шупрута Володимир 25'. // Видалення об’єкт. worker.free; end;
// Конструктор для класу TPersonal. // (Створити новий об’єкт з ім’ям 'Новий співробітник' і віком 0) constructor TPersonal.Create; begin inherited Create; fname:='Новий співробітник'; fage:=0; end;
// Метод класу TPersonal - процедура показу даних про співробітника. procedure TPersonal.showinfо; begin Messagebox.Show(fname+' '+fage.toString); end; end.
4.3. Основні принципи об’єктно-орієнтованого програмування
Ми познайомились з класами і об’єктами. Тепер розберемось з основними принципами ООП. Вся концепція ООП побудована на трьох принципах - інкапсуляції, спадкування і поліморфізм. Далі ми ознаймимося з цими принципами, пояснення яких побудовано на невеликому практичному прикладі.
4.3.1 Інкапсуляція і властивості об’єктів
Інкапсуляція (Encapsulation) - це механізм, що об’єднує дані і методи їх обробки, а також захищає від зовнішнього втручання або неправильного використання. В об’єктно-орієнтованому програмуванні методи і дані можут бути об’єднанні разом; в цьому випадку кажуть, що створюється «чорна скриня». В середині об’єкта методи і дані можут бути закритими. Закриті методи або дані доступні тільки для інших частин цього об’єкта. Таким чином, закриті коди і дані недоступні для тих частин програми, які існують назовні об’єкта. Якщо методи і дані є відкритими, то, недивлячись на то що вони задані в середині об’єкта, вони доступні для інших частин програми. Характерною є ситуація, коли відкрита частина об’єкта використовується для того, щоб забезпечити контролируємий інтерфейс закритих елементів об’єкта. В мові Delphi обмеження доступу до полів об’єкта реалізуєтся за допомогою властивостей об’єкта. Властивість (Property) об’єкта - характеристика об’єкта, яка визначається полем, що зберігає значення властивості, і двома методами, що забезпечують доступ до поля властивості. Метод встановлення значення властивості називаеться методом запису властивості (write), а метод отримання значення властивості - методом читання властивості (read). В описі класу перед ім’ям властивості записують слово property (властивість). Після імені властивості вказується його тип, потім - імена методів, що забезпечують доступ до значення властивості. Після слова read вказується ім’я метода, що забезпечує читання властивості, після слова write – ім’я метода, що відповідає за запис властивості. Якщо не треба обрабки при запису або читанні властивостей, то можна вказувати ім’я поля після ключевих слів write і read. Нижче в лістінгу 4.4 наведений приклад опису класа TPersonal, що містить дві властивості: Name і Age. Лістінг 4.4 Приклад опису класа, що містить властивості Name и Age // Оголошення класу.
TPersonal = class type TName = string [30] ; TAge = byte ; private fname:TName; // Значення властивості Name – ім’я співробітника. fage:TAge; // Значенння властивості Age - вік співробітника. function GetName:TName; function Getage:TAge; procedure SetAge(new_age:TAge); public // Конструктор - створення нового об’єкта(екземпляра класу). constructor Create(Name:TName;Age:TAge); procedure showinfo; //Це метод класу - показує інформацію // про співробітника. // Властивість об’єкта property Name:Tname // Властивість тільки для читання. read GetName; property Age:Tage // Властивість для читання і запису. read GetAge write SetAge; end ;
Зовнішне застосування властивостей в програмі нічим не відрізняється від використання полів об’єкта. Однак між властивостями і полями об’єкта існує принципова відмінність: при присвоєнні і читанні значення властивості автоматично викликається процедура (функція), яка виконує деяку роботу. Наприклад, інструкція
worker.Age:=25;
насправді буде перетворена компілятором в інструкцію виду:
worker.SetAge(25) ;
В програмі, на методи властивості можно покласти деякі додаткові задачі. Наприклад, за допомогою метода можна перевірити коректність значень що присвоюється властивості, встановити значення інших полів, що логічно зв’язані з властивістю, викликати додаткову процедуру і т.п. Оформлення даних об’єта як властивості дозволяє обмежити доступ до полів, що зберігає значення властивостей об’єкта, наприклад можна дозволити тільки читання. Для того щоб інструкції програми не могли змінити значення властивості, в описі властивості треба вказати лише ім’я метода читання. Спроба присвоїти значення властивості, що призначенна тільки для читання, викликає помилку часу компіляції. В наведеному вишче описі класу TPersonal властивість Name доступно тільки для читання, а властивість Age - для читання і запису. Встановити значенння властивості, захищеного від запису, можно під час ініціалізації об’єкта (під час виклику конструктора). Повний текст програми (з описом конструктора, процедур і функцій) наведений в лістінгу 4.6. Лістінг 4.51 Приклад програми, що демонструє створення і використання класу з описом властивостей 1 Шупрута В.В. Delphi 2005. Учимся програмировать. Стр. 156
unit WinForm; interface uses System.Drawing, System.Collections, System.ComponentModel, System.Windows.Forms, System.Data;
type TWinForm = class (System. Windows. Forms .Form) {$REGION 'Designer Managed Code'} strict private Components: System.ComponentModel.Container; Button1: System.Windows.Forms.Button; procedure InitializeComponent; procedure Button1_Click(sender: System.Object; e: System.EventArgs);
{$ENDREGION} strict protected procedure Dispose(Disposing: Boolean); override; private { Private Declarations } public constructor Create; end; TPersonal = class// Оголошення класу TPersonal. . type TName = string[30]; TAge = byte; private fname:TName; // Значенння властивостей Name – ім’я співробітника. fage:TAge; // Значенння властивостей Age - вік співробітника. function GetName:TName; function GetAge:TAge; procedure SetAge(new_age:TAge); public // Конструктор - створення нового об’єкта(екземпляр класу). constructor Create(Name:TName;Age:TAge); procedure Showlnfo; // Це метод класу - показує інформацію // про співробітника. // Властивість об’єкта property Name:TName // Властивість тільки для читання. read GetName; property Age:TAge // Властивість для читання і запису. read GetAge write SetAge; end ;
procedure TWinForm.Dispose(Disposing: Boolean); begin if Disposing then begin if Components <> nil then Components.Dispose(); end; inherited Dispose(Disposing); end;
// Конструктор для формы. constructor TWinForm.Create; begin inherited Create; InitializeComponent; end ;
procedure TWinForm.Button1_Click(sender: System.Object; e: System^.EventArgs) ; var worker: TPersonal; begin // Створення нового об’єкта. worker:=TPersonal.Create('Шупрута Володимир',0); // Виклик метода об’єкта - вивід інформації про співробітника. function GetName:TName; function GetAge:TAge; procedure SetAge(new_age:TAge); public // Конструктор – створення нового об’єкта(екземпляра класу). constructor Create(Name:TName;Age:TAge); procedure Showlnfo; // Це метод класу - показує інформацію про
//співробітника. // Властивість об’єкта property Name:TName // Властивість тільки для читання. read GetName; property Age:TAge // Властивість для читання і запису. read GetAge write SetAge; end ;
procedure TWinForm.Dispose(Disposing: Boolean); begin if Disposing then begin if Components <> nil then Components.Dispose(); end; inherited Dispose(Disposing); end;
constructor TWinForm.Create; // Конструктор для форми. begin inherited Create; InitializeComponent; end ;
procedure TWinForm.Button1_Click(sender: System.Object; e: System^.EventArgs) ; var worker: TPersonal; begin
// Створення нового об’єкта. worker:=TPersonal.Create('Шупрута Володимир',0); // Виклик методу об’єкта - вивід інформації про співробітника. worker.showinfо; // На екрані повідомлення 'Шупрута Володимир '. // Зміна властивості об’єкта. worker.age:=25; // Виклик методу об’єкта - вивід інформації про співробітника worker.showinfо; // На екрані повідомлення 'Шупрута Володимир 25'. // Уничтожаем объект. worker.free; end;
// Конструктор для класу TPersonal. // При виклику створюється новий об’єкт з ім’ям Name і віком Age. constructor TPersonal.Create(Name:TName;Age:TAge); begin inherited Create; fname:=Name; fage:=Age; end;
// Метод отримання значення властивості Name. function TPersonal.GetName; begin result:=fname; end;
// Метод отримання значення властивості Age. function TPersonal.GetAge; begin result:=fage; end;
// Метод запису значення властивості Age.
procedure TPersonal.SetAge(new_age:TAge); begin // Приклад обробки значення на запис. // Якщо значення, що присвоюється властивості, <20, то // влістивість не змінює свого значення. if new_age<20 then exit else fage:=new_age; end;
// Метод класу TPersonal - процедура показу даних про співробітника. procedure TPersonal.Showinfо; begin messagebox.Show(Name+' '+Age.Tostring); end;
end.
Питання:
Література:
1. Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. 2006 г. - 1152 с. 2. Архангельский А.Я. Delphi 2006. Справочное пособие: язык Delphi, классы, функции Win32 и .NET, 2006 г. - 1152 с. 3. Архангельский А.Я. Приемы программирования в Delphi на основе VCL, 2006 г. - 944 с. 4. Архангельский А.Я. Программирование в Delphi для Windows. Версии 2006, 2007, Turbo Delphi, 2007 г. - 1248 с. 5. Гофман В. Э., Хомоненко А. Д. Delphi. Быстрый старт. — СПб.: БХВ-Петербург, 2003. — 288 с: ил. 6. Шупрута В.В. Delphi 2005. Учимся програмировать.