Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. 2006 г. - 1152 с.

Метод в ООП

Методи(Method) класу (процедури і функції, оголошення яких включено в опис класу) виконання деяких дій над об’єктами класу (що характеризує поведінку об’єтів). Для того щоб метод був виконаний, необхідно вказати імена об’єкту і методу, відокремивши ім’я від методу точкою. Наприклад, інструкція

 

  dict.ShowInfo

 

викликають застосування метода ShowInfo до объекта dict. Фактично інструкція застосування методу до об’єкту - це специфічний спосіб запису інструкції виклику процедури.

Методи класу визначаються в програмі так само, як і звичайні процедури і функції, за виключенням того, що ім’я процедури або функції, що є методом, складаються з двох частин: імені класу, якому належить метод, і імені метода. Ім’я класу від імені метода відокремлюється точкою.

Нижче в лістінгу 4.2 наведений приклад визначення метода showinfo класу TDictionary.

 

Лістінг 4.2. Метод showinfo класса TDictionary

  procedure TDictionary.showinfo; begin // Вивід на екран даних про слово з словника. Messagebox.Show(fWord+' '+fPartOfSpeech.toString); end;

Як видно з лістінга 4.2, в інструкціях метода доступ до полів об’єкта здійснюється без вказання імені об’єкта.

Далі наведений приклад програми (лістінг 4.3), в якому оголошується клас TDictionary, над об’єктом якого (dict) виконуєть різні дії.

Лістінг 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; Butston1: 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; // Цей метод класу - показує // інформацію про співробітника. end;
[assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))] implementation {$AUTOBOX ON} {$REGION 'Windows Form Designer generated code1} 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 writeSetAge; end ;

 

Зовнішне застосування властивостей в програмі нічим не відрізняється від використання полів об’єкта. Однак між властивостями і полями об’єкта існує принципова відмінність: при присвоєнні і читанні значення властивості автоматично викликається процедура (функція), яка виконує деяку роботу. Наприклад, інструкція

 

  worker.Age:=25

 

насправді буде перетворена компілятором в інструкцію виду:

 

  worker.SetAge(25)

 

В програмі, на методи властивості можно покласти деякі додаткові задачі. Наприклад, за допомогою метода можна перевірити коректність значень що присвоюється властивості, встановити значення інших полів, що логічно зв’язані з властивістю, викликати додаткову процедуру і т.п.

Оформлення даних об’єта як властивості дозволяє обмежити доступ до полів, що зберігає значення властивостей об’єкта, наприклад можна дозволити тільки читання. Для того щоб інструкції програми не могли змінити значення властивості, в описі властивості треба вказати лише ім’я метода читання. Спроба присвоїти значення властивості, що призначенна тільки для читання, викликає помилку часу компіляції.

В наведеному вишче описі класу TPersonal властивість Name доступно тільки для читання, а властивість Age - для читання і запису.

Встановити значенння властивості, захищеного від запису, можно під час ініціалізації об’єкта (під час виклику конструктора).

Повний текст програми (з описом конструктора, процедур і функцій) наведений в лістінгу 4.6.

Лістінг 4.5[1]Приклад програми, що демонструє створення і використання класу з описом властивостей

  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 writeSetAge; end ; [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))] implementation {$AUTOBOX ON} {$REGION 'Windows Form Designer generated code1} 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 writeSetAge; end ; [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm))] implementation {$AUTOBOX ON} {$REGION 'Windows Form Designer generated code1} 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. Що таке методи в ООП.

2. Що таке інкапсуляція.

 

Література:

 

Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. 2006 г. - 1152 с.

2. Архангельский А.Я. Delphi 2006. Справочное пособие: язык Delphi, классы, функции Win32 и .NET, 2006 г. - 1152 с.