Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНые РАБОТАы с 9.doc
Скачиваний:
26
Добавлен:
10.05.2015
Размер:
545.28 Кб
Скачать

Лабораторная работа №11 Объектно-ориентированное программирование Определение класса

Класс это тип определяемый пользователем. Используется для создания множества объектов, имеющих общие свойства и поведение. Так как класс – это тип данных, то он должен обеспечить: представление в памяти объектов типа и набор операций над ними.

Объектно-ориентированное программирование опирается на три основных свойства: инкапсуляция, наследование, полиморфизм. Инкапсуляция – данные и операции над ними образуют одну структуру. Наследование – создание новых классов (типов) на основе существующих т.е. развитее класса родителя в потомках. Наследник (потомок) наследует все данные и методы класса родителя и дополняет его своими данными и методами. Полиморфизм – обеспечивает различную реализацию одноименным методам разных уровней одной иерархии.

Формат определения базового класса

Type

Имя класса=class

[private]

элементы класса

[public]

элементы класса

[protected]

элементы класса

[publeshed]

элементы класса

[property]

свойства класса

end;

Элементами класса являются поля данных и методы. Поля данных предназначены для хранения значений свойств объектов, а методы – это подпрограммы, реализующие операции над объектами класса или полями данных.

Ключевые слова private, public, protected, published обеспечивают уровень доступа к элементам класса. Так к элементам класса, перечисленным после слова private разрешен доступ только из методов этого класса, а перечисленным после public разрешен доступ из других модулей. Под protected указываютя элементы, которые должны быть доступны в методах наследника.

Поля класса

Используются для определения свойств реального объекта. Могут быть любого типа, в том числе и типа класса. Поля являются глобальными переменными для методов своего класса. Доступ к полю в методах класса осуществляется по имени поля, если поле доступно наследнику, то тоже по имени.

Методы

Это процедуры и функции, которые реализуют операции над данными класса. Методы можно разбить на виды:

  • специальные: конструктор и деструктор;

  • методы доступа к полям;

  • методы модификации полей;

  • методы – операции с данными полей.

Методы могут быть объявлены в любом разделе: public, protected, private. Методы, которые могут использоваться приложениями должны быть объявлены в разделе public. Методы могут иметь параметры. Параметры могут быть любого типа, включая объекты того же класса, что и метод, либо другого класса.

Реализация методов

Это определения всех подпрограмм класса. Определения методов в Delphi вынесены из класса и могут находиться в одном модуле с определением класса или в разных модулях. Имя подпрограммы, реализующей метод организуется по правилу: ИмяКласса.ИмяМетода.

Метод конструктор

Этот метод предназначен для создания объектов определенного класса и инициализации полей данных, а так же помещает ссылку на объект во системную переменную с именем self, которая по умолчанию присутствует в классе.

В приложениях Delphi можно использовать два вида методов конструктор: конструктор по умолчанию – Create, и конструктор разработанный пользователем.

В Delphi объект (экземпляр класса) – это переменная типа класс. Переменная в свою очередь является указателем на динамическую область памяти, т.е. объект в Delphi – это динамическая структура данных, которая создается во время выполнения программы конструктором и ссылку на эту область хранит указатель.

Конструктор по умолчанию - Create

Class является наследником класса TObject, этот класс содержит метод конструктор, который имеет имя Create. Данный метод не имеет параметров. Он создает объект указанного класса и инициализирует поля объекта следующим образом: нулевыми значениями числовые переменные, пустой строкой строковые и т.д.

Явно определенный конструктор

Это обычная подпрограмма – процедура, заголовок которой имеет вид:

constructor ИМЯ(Список параметров)

Конструктор может не иметь параметров. Он так же предназначен для создания и инициализации полей объекта. Этот метод вызывает автоматически метод Create, который обеспечит выделение динамической памяти под объект.

Метод деструктор

Этот метод предназначен для удаления из памяти (уничтожения) объекта (экземпляра класса). Приложение может использовать для уничтожения объекта один из деструкторов: по умолчанию или созданный пользователем.

Деструктор по умолчанию – Destroy

Этот метод автоматически вызывается при завершении программы для каждого созданного в программе объекта. Если объект требуется уничтожить раньше завершения программы, то этот метод надо вызвать явно.

Явно определенный деструктор

Предназначен для уничтожения экземпляра класса, как и Destroy. Деструктор - это подпрограмма процедура с заголовком вида Destructor ИМЯ(список параметров). Явно определенный деструктор автоматически вызовет деструктор по умолчанию. В деструкторе можно выполнить дополнительные действия над данными объекта. Деструктор должен быть определен в классе, в котором используются динамические структуры данных, например, динамический массив, динамический список и т.д. для удаления этих структур при уничтожении самого объекта, так как деструктор по умолчанию удалит объект, но не удалит динамическую структуру, связанную с объектом.

Другие методы класса

Класс может иметь методы, которые производят операции над данными: например, находят количество дней между двумя датами, сортируют массив или удаляют из него элементы, или складывают две дроби, или вычисляют значение интеграла.

Вызов методов

Метод вызывается по тем же правилам, что и соответствующая методу подпрограмма – процедура или функция. Но метод предназначен выполнять действия с данными некоторого объекта (применяется к объекту).

Формат вызова метода:

ИМЯ объекта.Имя метода (список фактических параметров)

Метод применяется к объекту, который указывается слева от него.

Пример реализации класса Интеграл

//модуль определения класса

unit Unit2;

interface

Type

Tfunc=function(x:real):real;

Integral=class

protected

a, b,eps:real; //пределы интегрирования и точность

F:Tfunc;

//метод вычисления интеграла на заданном числе разбиений //отрезка интегрирования

function Int(n:word):real;

public

procedure setA(a1:real);

procedure setB(b1:real);

constructor create;

procedure setEps(e:real);

procedure setF(f1:Tfunc);

//метод вычисления интеграла с заданной точностью

function Metod:real;

end;

implementation

//реализация методов

constructor Integral.create;

begin

a:=0;b:=0; eps:=0;

end;

procedure Integral.setA(a1:real);

begin

a:=a1;

end;

procedure Integral.setB(b1:real);

begin

b:=b1;

end;

procedure Integral.setEps(e:real);

begin

eps:=e;

end;

procedure Integral.setF(f1:Tfunc);

begin

F:=f1;

end;

function Integral.Int(n:word):real;

var i:word;

s,x,h:real;

begin

result:=0; x:=a; h:=(b-a)/n;

for i:=1 to n do

result:=result+ (f(x)+f(x+i*h))*(b-a)/2;

end;

function Integral.Metod:real;

var Int1, Int2:real;

n:word;

begin

n:=1;

Int1:=Int(n);

Int2:=INT(2*n);

while(abs(Int1-Int2)<eps) do

begin

Int1:=Int2;

n:=n*2;

Int2:=INT(n);

end;

result:=INT1;

end;

end.

Программные объекты

Простые объекты

Это переменные типа класс. Объекты – это динамические переменные создаваемые конструктором. Как и всем переменным объектам выделяется память для хранения данных и ссылок на методы.

Массивы объектов

Массив объектов – это массив указателей на объекты.

Пример создания и использования объекта.

var

I1: Integral;

Function fx(x:real):real;

Begin

F:=x*x

End;

begin

o:= Integral.Create;

I1.SetA(0);

I1.SetB(1);

I1.SetEps(0.001);

I1.setF(fx);

Writeln(Значение интеграла=, I1.Metod);

End.

Операции над объектом в целом

Над объектом допустима операция присваивания.

Но так как имена объектов это указатели на объекты, то при присваивании объектов мы получаем указатели на одну и ту же область памяти объекта. Чтобы создать копию объекта O, необходимо создать объект, напимер, с именем D и переписать в него значения полей копируемого объекта. Для этого необходимо будет разработать метод копирования в классе, или методы доступа к значениям полей класса, и тогда пользовательское приложение сможет сделать копию.

Свойства класса

Это механизм доступа к полям объекта. Используется для того, чтобы проверить значение перед тем, как оно будет присвоено полю. Этот механизм позволяет использовать оператор присваивания для записи значения в поле и считывания значения поля.

Для реализации доступа к полю по чтению и записи в классе должны быть предусмотрены методы: Метод записи типа Set(записать значение) и Метод чтения Get (прочитать значение поля). Каждое свойство связано с отдельным полем. В определении свойства можно указать только один метод, например, разрешить через механизм свойства только чтение данных из поля.

Форматы определения свойства в классе:

1) При использовании методов чтения и записи

Property <имя свойства>:тип свойства read Метод чтения write Метод записи;

2) Использование имени поля для чтения и записи его значений

Property <имя свойства>:тип свойства read Имя поля write Имя поля;.

Пример определения и использования свойств класса

//Модуль определения класса Рациональная дробь

unit ClassDroby;

interface

type

Tdroby =class

private

fa,fb,fr: byte;

p:boolean;

function NOD:byte;

PROCEDURE Sokrash;

public

constructor create(x,y:byte);

procedure set_a (x:byte);

procedure set_b(x:byte);

procedure get_a (var x:byte);

procedure get_b(var x:byte);

function get_priznak:boolean;

procedure ADD(D:Tdroby); //Сложение дробей

//свойства класса

property a:byte read get_a write set_a;

property b:byte read get_b write set_b;

end;

implementation

procedure Tdroby.set_a (x:byte);

begin

if x=0 then pa:=false

else begin fa:=x;pa:=true end;

end;

procedure Tdroby.set_b(x:byte);

begin

if x=0 then pb:=false

else begin fb:=x;pb:=true end;

end;

function Tdroby.get_a:byte;

begin

result:=fa

end;

function Tdroby.get_b:byte;

begin

result:=fb

end;

procedure Tdroby.ADD(D:Tdroby);

begin

a:=D.a*b+D.b*a;

b:=D.b*b;

r:=NOD;

sokrash;

end;

end.

//Основная программа

var

R:TDroby;

c,b:byte;

begin

R:=TDroby.Create;

R.set_a(5); //присваивание значения полю методом

R.set_b(7);

writeln(R.get_a,'/',R.get_b);

R.a:=6; //присваивание значения полю через свойства

R.b:=7;

c:=R.a; //присваивание переменной значения поля

b:=R.b;

writeln(c,'/',b);

readln

end.