- •Лабораторная работа №9 Комбиированный тип - запись Тип данных – Запись
- •Формат определения типа.
- •Правила создания записного типа
- •Представление переменной типа запись в памяти
- •Доступ к значению поля в записи
- •Расчет объема памяти, выделяемого переменной типа запись
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Пример разработки одномодульного приложения.
- •Контрольные вопросы
- •Лабораторная работа 10 Разработка приложений под Windows средст вами Delphi Создание оконного приложения
- •Требования к выполнению лабораторной работы
- •Контрольные вопросы
- •Лабораторная работа №11 Объектно-ориентированное программирование Определение класса
- •Наследование
- •Требовния к выполнению лабораторной работы
- •Варианты заданий
- •Контрольные вопросы.
- •Лабораторная работа №12 файлы Текстовый файл
- •Типизированный файл
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Контрольные вопросы
- •Библиографический список
Лабораторная работа №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.