Реферат Програмування. Delphi

Страница 1 из 3 | Следующая страница

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

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

Объектно-ориентированное програмування (ОВП) - це методика розробки програм, основу якої лежить поняття об'єкта, як деякою структури, яка описує об'єкт реального світу, її поведінка. Завдання, розв'язувана з допомогою методики ОВП, описується в термінах об'єктів і операцій з них, а програма за такого підходу є набір об'єктів і перетинів поміж ними.

Зауваження

У принципі, у тому, щоб розробляти докладання в Delphi з урахуванням наданих середовищем розробки компонентів, знання концепції ОВП перестав бути необхідним. Проте задля глибшого розуміння, як програма взаємодіє зі компонентами, чого і чому Delphi додає до тексту програми, матеріал даної глави дуже корисним.

Клас

Класичний мову Pascal дозволяє програмісту визначати свої власні складні типи даних - записи (records). Object Pascal, підтримуючи концепцію объектно-ориентированного програмування, дає можливість визначати класи. Клас - це складна структура, куди входять у собі крім описи даних опис процедур та зняття функцій, які можна виконані над представником класу - об'єктом.

Ось приклад описи простого класу:

TTPerson=class

Private

 fname: string [15] ;

f address: string [35] ;

public

procedure show;

end;

Дані класу називаються полями, процедури і функції - методами. У наведеному прикладі TTPerson - це класу, fname і faddress - імена полів, show - ім'я методу.

Зауваження

Відповідно до прийнятого Delphi угоді імена полів повинні починатися з літери f (від слова field - полі).

У конкурсній програмі опис класу вміщують у розділ описи типів (type).

Об'єкт

У конкурсній програмі представники класу - об'єкти, з'являються розділ var. Наприклад, так:

var

student: TTPerson;

professor: TTPerson;

Слід особливо звернути увагу те що, що у Object Pascal об'єкт - це динамічна структура. Переменная-объект містить не дані, а посилання дані об'єкта. Тому програміст має потурбуватися виділення пам'яті тих даних.

Виділення пам'яті здійснюється за допомогою спеціального методу класу - конструктора, якому зазвичай привласнюють ім'я create (створити). Щоб підкреслити особливу роль і поведінку конструктора, описання класу замість слова procedure використовується слово constructor. Нижче наведено опис класу TTPerson, до складу якої запроваджено конструктор.

TTPerson = class

private

 fname: string [ 15] ;

 f address: string [35] ;

 constructor create; // конструктор

 public

procedure show; // метод

end;

Виділення пам'яті для даних об'єкта відбувається присвоюванням значення результату застосування метода-конструктора до типу (класу) об'єкта. Наприклад, після виконання інструкції

professor: =TTPerson.create ;

виділяються необхідні пам'ять для даних об'єкта professor .

Крім виділення пам'яті, конструктор, зазвичай, переймається тим присвоювання полях об'єкта початкових значень, т. е. здійснює ініціалізацію об'єкта. Нижче наведено приклад реалізації конструктора для об'єкта TTPerson.

constructor TTPerson.create ;

begin

fname: = ‘ ‘ ;

faddress:=’’' ;

end;

Реалізація конструктора трохи незвичайна. По-перше, у тілі конструктора немає звичних інструкцій New, які забезпечують виділення динамічної пам'яті (всю роботу зі виділенню пам'яті виконує компілятор). По-друге, формально, конструктор не повертає значення, хоча у програмі звернення до конструктору здійснюється, як до методу-функции.

Після оголошення і ініціалізації об'єкт можна використовувати, наприклад, встановити значення поля об'єкта. Доступ від поля об'єкта здійснюється зазначенням імені об'єкту і імені поля, які відокремлюються друг від друга точкою. Хоча об'єкт є посиланням, проте правило доступу до даних з допомогою посилання, за яким після імені перемінної, що є посиланням, треба робити значок ^ на об'єкти не поширюється. Наприклад, для доступу від поля fname об'єкта professor замість

professor^. Fname

 треба писати

professor.fname

Вочевидь, що такий спосіб доступу до полях об'єкта більш природний.

Якщо програмі певний об'єкт большє нє використовується, можна звільнити пам'ять, зайняту полями цього об'єкта. На виконання цього дії використовують метод-деструктор free. Наприклад, щоб звільнити пам'ять зайняту полями об'єкта professor, досить записати

professor.free;

Метод

Методи класу (процедури і функції, оголошення яких включено на змалювання класу) виконують дії над об'єктами класу. Щоб метод було виконано, слід зазначити ім'я об'єкту і ім'я методу, відмежувавши саме ім'я від іншого точкою. Наприклад, інструкція

professor.Show;

викликає застосування методу show об'єкта professor. Фактично інструкція застосування методу об'єкта - це специфічний спосіб записи інструкції виклику процедури.

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

Нижче наведено приклад визначення методу show наведеного вище класу TTPerson.

// метод show класу TTPerson

procedure TTPerson. show;

 begin

ShowMessage(‘Имя:'+fname+#13+'Адрес: '+faddress) ;

 end;

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

Инкапсуляция й поліпшуючи властивості об'єкта

Під инкапсуляцией розуміється приховання полів об'єкта з метою забезпечення доступу до них лише за допомогою методів класу.

У Object Pascal обмеження доступу до полях об'єкта реалізується з допомогою властивостей об'єкта. Властивість об'єкта характеризується полем, що зберігає значення властивості, і двома методами, забезпечують доступом до полю властивості. Метод установки значення властивості називається методом записи властивості (write), метод отримання значення властивості називається методом читання властивості (read).

У описі класу перед ім'ям властивості записують слово property (властивість). Після імені властивості вказується його тип, потім імена методів, які забезпечують доступом до значенням властивості. Після слова read вказується ім'я методу, забезпечує читання властивості, після слова write - записи властивості ім'я методу. Нижче наведено приклад описи класу TTPerson, що містить два властивості: Name і Address.

type

TName=string[15] ;

 TAddress=string[35] ;

TTPerson = class

 Private

 FName:Tname; // значення св-ва Name

Faddress:TAdress; // значення св-ва Address

Constructor Create (Name :Tname) ;

Procedure Show;

Function GetName:TName;

Function GetAddress:TAddress;

Procedure SetAddress (NewAddress: TAddress ) ;

Public

Property Name: Tname

read GetName;

Property Address: Taddress

read GetAddress

write SetAddress;

end;

У конкурсній програмі для установки значення властивості необов'язково записувати інструкцію застосування об'єкта методу установки значення властивості, можна записати звичайну інструкцію присвоювання значення властивості. Наприклад, щоб привласнити значення властивості Adress об'єкта student, досить записати

Student.Address:= 'С.Петербург, ул.Садовая 21, кв. 3';

Компилятор перетранслирует наведену інструкцію присвоювання значення властивості в інструкцію виклику методу

Student.SetAddress ( ' З. Петербург, вул. Садова 21, кв .3'),•

Зовні використання властивостей у програмі нічим не відрізняється від використання полів об'єкта. Разом про те між властивістю і полем об'єкта існує принципова різниця: при привласненні й читанні значення властивості автоматично викликається процедура, що виконує деяку роботу.

У конкурсній програмі на методи властивості можна покласти деякі додаткові завдання. Наприклад, з допомогою методу можна перевірити коректність присваиваемых властивості значень, встановити значення інших, логічно пов'язаних із властивістю, полів, викликати допоміжну процедуру.

Оформлення даних об'єкта як властивості дозволяє обмежити доступом до полях, хранящим значення властивостей об'єкта, наприклад можна лише читання. Щоб інструкції програми було неможливо змінити значення властивості, описання властивості слід зазначити лише ім'я методу читання. Спроба привласнити значення властивості, призначеному лише читання, викликає помилку часу компіляції. У наведеному вище описі класу TTperson властивість Name доступні лише для читання, а властивість Address - для читання і запис.

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

//конструктор об'єкта TTPerson

Constructor TTPerson.Create (Name:TName) ;

begin

FName:Name ; end;

// метод отримання значення властивості Name

Function TTPerson.GetName ;

 begin

Result: =FName ;

 end;

// метод отримання значення властивості Address

Function TTPerson.GetAddress;

 begin

Result: =FAddress;

end;

// метод зміни значення властивості Address

Procedure TTPerson.SetAddress (NewAddress: TAddress ) ;

Begin

 if FAddress=' '

then FAddress: =NewAddress;

 end;

Наведений конструктор об'єкта TTPerson створює об'єкт й встановлює значення поля FName, визначального значення властивості Name.

Інструкції програми, щоб забезпечити створення об'єкта класу TTPerson та встановлення його властивості, може бути, наприклад, такими:

student: =TTPerson.create ( ' Іванов ' ) ;

student.address:='yл. Садова, д.З, кв.25';

Наследование

Концепція объектно-ориентированного програмування припускає можливість визначати нові класи у вигляді додавання полів, властивостей і методів до існуючих класам. Такий механізм отримання нових класів називається породженням. У цьому новий, породжений, клас (нащадок) успадковує властивості і нові методи свого базового, батьківського класу.

У оголошенні класса-потомка вказується клас батька. Наприклад, клас TEmployee (співробітник) то, можливо породжена від розглянутої вище класу ттрегзоп шляхом додавання поля Department (відділ). Оголошення класу TEmployee у разі може бути так:

TEmployee = class (TTPerson)

FDepartment: integer; // номер відділу

constructor Create (Name :TName;Dep: integer) ;

end;

Укладена в дужки ім'я класу TTPerson показує, що клас TEmployee є похідною класу TTPerson. Натомість, клас ттрегзоп базове для класу TEmployee.

Клас TEmployee має власний конструктор, що забезпечує ініціалізацію класу батька і "своїх полів. Ось приклад реалізації конструктора класу TEmployee:

constructor TEmployee.Create(Name:Tname;Dep:integer);

begin

inherited Create (Name);

FDepartment: =Dep;

end;

У наведеному прикладі директивою inherited викликається конструктор батьківського класу, потім присвоюється значення полю класу нащадка.

Після створення об'єкта похідного класу у програмі можна використовувати поля і нові методи батьківського класу. Нижче наведено фрагмент програми, що демонструє таку можливість.

engineer: =TEmployee.create ( ' Сидоров ' , 413 ) ;

engineer.address:='yл.Блохина, д.8, кв.10';

Перша інструкція створює об'єкт типу TEmployee. Друга встановлює значення властивості, яке належить до батьківській класу.

Директиви Protected і Private

Крім оголошень елементів класу (полів, методів, властивостей) опис класу, зазвичай, містить директиви protected (захищений) і private (закритий), які ступінь видимості елементів класу у програмі.

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

Елементи класу, оголошені в секції private, видимі всередині модуля. Ці елементи не доступні поза модуля, навіть у похідних класах. Зазвичай, у секцію Private поміщають опис полів класу, а методи, щоб забезпечити доступом до цим полях, вміщують у секцію protected.

Нижче наведено опис класу TTPerson, у якому включені директиви управління доступом.

TTPerson = class

private

Fname:TName; { значення св-ва Name }

Faddress:TAddress; ( значення св-ва Address)

protected

Constructor Create (Name :TName);

Function GetName :TName ;

Function GetAddress:TAddress;

Procedure SetAddress(NewAddress:TAddress);

Property Name:Tname

 read GetName;

Property Address :Taddress

read GetAddress

write SetAddress;

end;

Зауваження

якщо треба щоб елементи класу були цілком приховані, то визначення класу слід розмістити у окремий модуль.

Полиморфизм і віртуальні методи

Полиморфизм - це можливість вільно використовувати однакові імена для методів, які входять у різні класи. Концепція поліморфізму забезпечує при застосуванні методу об'єкта використання саме тієї методу, що відповідає класу об'єкта.

Нехай визначено три класу, них базове двох інших.

type // базовий клас

TPerson=class

fname: string; { ім'я }

constructor Create (name: string);

function info: string;

virtual;

end;

// похідний від базового Tperson

TStud=class (TPerson)

fgr: integer; { номер групи }

constructor Create (name: string; gr: integer) ;

function info: string; override;

end;

// похідний від базового Tperson

Tprof=class (TPerson)

fdep: string; { назва кафедри }

constructor Create(name:string;dep:string);

function info: string; override;

end;

У кожному з цих класів визначено метод info. У базовому класі з допомогою директиви virtual метод info оголошено віртуальним. Оголошення методу віртуальним дає можливість дочірньому класу зробити заміну віртуального методу власним. У кожному дочірньому класі визначено свій метод info, який заміщає відповідний метод батьківського класу (метод породженого класу, замісник віртуальний метод батьківського класу, позначається директивою override). Нижче наведено визначення методу info кожному за класу.

function TPerson.info: string;

begin

result=’’ ;

 end;

function TStud.info:string;

begin

result :=fname+' гp. '+IntTostr(fgr) ;

end;

function TProf.info: string;

begin

result :=fname+' каф. '+fdep;

end;

У конкурсній програмі список людей уявити масивом об'єктів класу TPerson.

list:array[1..SZL]of TPerson;

Зауваження

Тут варто згадати, що об'єкт - це покажчик.

Оголосити таким чином список можна оскільки Object Pascal дозволяє покажчику на батьківський клас привласнити значення покажчика на дочірній клас. Тому елементами масиву list може бути як об'єкти класу TStud, і об'єкти класу Tprof.

Висновок списку можна здійснити застосуванням методу info до елементам масиву, наприклад, так:

st:=’’;

for i:=l to SZL do // SZL - розмір массива-списка

if list[i] <> NIL

then st:=st+info.list[i]+#13; ShowMessage(st);

Під час роботи програми кожен елемент масиву може містити як об'єкт типу TStud, і об'єкт типу Tprof. Концепція поліморфізму забезпечує застосування об'єкту саме тієї методу, що відповідає типу об'єкта.

Процедура TForml.Button1click, яка запускається внаслідок щиглика на кнопці Додати (Button1), створює об'єкт list[n] класу TStud чи TProf. Клас створюваного об'єкта визначається станом радиокнопки студент (RadioButton1),

Процедура TForml.Button2Click, яка виконується внаслідок щиглика на кнопці Список (Button2), застосовуючи метод info до кожного об'єкту списку (елементу масиву), формує рядок, яка була весь список.

Класи і об'єкти Delphi

Задля реалізації інтерфейсу Delphi використовує бібліотеку класів, яка -містить велику кількість різноманітних класів, підтримують форму й різні компоненти (командні кнопки, поля редагування тощо. буд.).

Під час проектування форми докладання Delphi автоматично додає до тексту програми необхідні об'єкти. Якщо відразу після запуску Delphi переглянути вміст вікна редактора коду, можна побачити такі рядки:

type

Tform1 = class (TForm)

private

{ Private declarations }

public

{ Public declarations }

 end;

var

 Form1: Tform1

Це опис класу вихідної, порожній, форми докладання і оголошення об'єкта - форми докладання.

Коли програміст, додаючи необхідні компоненти, створює потрібну форму, Delphi формує опис класу форми. Коли програміст створює функцію обробки події форми, чи її компонента, Delphi додає оголошення методу на змалювання класу форми докладання.

Крім класів візуальних компонентів до бібліотеки класів входить клас обробки виняткових ситуацій (помилок), клас загального управління додатком та інші. Розгляд цих класів завданням цієї книжки не входить.

Створення простого текстового редактора

1. Помістіть компонент Bevel (сторінка Additional) нові форму і привласніть його властивості Align значення alTop.

2. На компонент Bevel помістіть чотири кнопки. Озаглавьте їх &0реn..., &Save, Save &As... і E&xit.

Крапки наприкінці імені є

Страница 1 из 3 | Следующая страница

Схожі реферати:

Навігація