Лекція №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; // Цей метод класу - показує
// інформацію про співробітника.

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 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 ;

[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 write SetAge;
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. Архангельский А.Я. Программирование в 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. Учимся програмировать.