ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.05.2024
Просмотров: 80
Скачиваний: 0
СОДЕРЖАНИЕ
Объектно-ориентированная парадигма программирования.
Объектно-ориентированный анализ
Объектно-ориентированное программирование.
Объектно-ориентированное проектирование.
Классы и объекты в Object Pascal.
Важнейшие принципы объектно-ориентированного программирования.
Создание и уничтожение объектов.
Var a,b:Тcomp;
begin
a:= Тcomp.create; {вызывается конструктор}
a.input (6,10);
. . . . .
a.free
end.
Свойства и инкапсуляция.
Инкапсуляция означает объединение данных и действий над ними в одном объектном типе.
Для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и обновление содержимого полей должно производиться посредством соответствующих методов – это называется инкапсуляцией.
В Delphi ограничение доступа к полям объекта осуществляется при помощи свойств объекта.
Определение: Свойство – это специальный механизм классов, регулирующий доступ к полям. Свойство определяется тремя элементами: полем и двумя методами, которые осуществляют чтение и запись этого поля.
Свойства объявляются с помощью трех зарезервированных слов:
Property,
read,
write,
причем read и write считаются зарезервированными только в контексте объявления свойства.
Обычно свойство связано с некоторым полем, оно указывает те методы класса, которые должны исполняться при записи в это поле, и при чтении из него. Описание свойства имеет вид:
Property <имя свойства>: <тип> read <имя метода 1>
write <имя метода 2>;
Методы чтения (вывода поля) и записи (ввода поля) всегда оформляются так:
Function <имя метода 1> : <тип>; {метод чтения (вывода)}
Procedure <имя метода 2> (<параметр> : <тип>); {метод записи}
Например:
Type TInt=class
data:integer; // поле класса
Procedure impdata (x:integer); {метод записи в поле data}
Function Outdata:integer; {метод чтения из поля data}
Procedure Add(x:integer); {процедура сложения исходного
поля с х}
. . . . .
Property dataInt: integer //свойство
read Outdata // метод чтения
write Impdata; // метод записи
end;
Доступ к значению свойства dataInt осуществляется через вызовы методов Outdata и Impdata. Однако в явном обращении к этим методам нет необходимости. Достаточно написать, например, для объекта a этого класса:
Var a:TInt; {объявляем a как объект класса TInt}
Begin . . . . . . . . . . . . .
a.dataInt:=<значение>;
{<значение> –это число, которое присваивается полю a }
Затем переменной <результат> присвоить c помощью свойства результат вычислений:
<результат>:= a.dataInt;
Компилятор при этом оттранслирует эти операторы в вызовы методов Outdata и Impdata. Т.о., свойство выглядит как обычное поле, но за всяким обращением к нему стоят нужные действия.
Создадим класс целых чисел, реализующий арифметические операции над ними (например, сложение). Для программы используем консольное приложение в Delphi. На примере создания класса целых чисел рассмотрим 2 случая:
В описании класса нет свойства, но есть методы чтения (вывода) и записи (ввода) данных в поле объекта.
В описании класса есть свойство.
Создание класса целых чисел без свойства:
Program Integer_class1;
{$APPTYPE CONSOLE}
uses SysUtils;
Type TInt=class
data:integer; // поле класса
Procedure Impdata (x:integer); //метод записи в поле
Function Outdata:integer; // метод чтения из поля
Procedure Add(x:integer); //метод сложения целых чисел
end;
Procedure TInt.Impdata; //описание метода записи Impdata
begin
data:=x; {записываем значение пар-ра x в поле data}
end;
Function TInt.Outdata; // описание метода чтения Outdata
begin
result:=data; {метод возвращает значение поля data}
end;
Procedure TInt.Add; {метод сложения поля data с пар-ром x }
begin
data:=data+x; {к полю data прибав. x, результат–в поле data}
end;
Var a:TInt; {объявляем a как объект класса TInt}
X:integer;
begin
{ TODO …………………………………………………}
a:=TInt.Create; {создаем объект a с помощью конструктора}
{Create не прописывается. Он берется из TObject}
a.Impdata(5); {с помощью метода Impdata полю data присвоим 5}
writeln('data=', a.Outdata); {метод Outdata читает полученное значение поля data объекта a и выводит его на экран}
write('x=');
readln(x); {вводим x с клавиатуры }
a.Add(x);{объект a вызывает метод Add с парам. x, т.е. к полю data прибавляется x)}
writeln('data=', a.Outdata); {метод Outdata читает значение поля data объекта a }
a.Free; {уничтожаем объект a с помощью деструктора}
readln;
End.
Программа со свойством
program Integer_class2;
{$APPTYPE CONSOLE}
uses SysUtils;
Type TInt=class
data:integer;
Procedure impdata (x:integer);
Function Outdata:integer;
Procedure Add(x:integer);
Property dataInt:integer //свойство
read Outdata //чтение из поля
write Impdata; //запись в поле
end;
Procedure TInt.impdata;
begin
data:=x;
end;
Function TInt.Outdata;
begin
result:=data;
end;
Procedure TInt.Add;
begin
data:=data+x;
end;
Var a:tInt;
X:integer;
Begin
{ TODO……………………………… }
a:=TInt.Create; {создаем объект a с помощью конструктора}
a.dataInt:=5;{св-во dataInt, вызванное объектом a, с помощью метода impdata заносит 5 в поле data}
writeln('data=', a.dataInt); { св-во dataInt, вызванное объектом a, с помощью метода Outdata выводит значение поля data}
write('x=');
readln(x);
a.Add(x);
writeln('data=', a.dataInt);
a.Free;
readln;
end.
Создание класса комплексных чисел.
Создадим класс комплексних чисел, в котором реализована комплексная арифметика. Для этого создадим модуль Complex с описанием класса Comp.
Unit Complex;
Interface
Uses SysUtils, Dialogs;
Type comp=class
re,im:real;
function modul:real;
//методы ввода и вывода значений действительных части объекта класса Comp
procedure Impre(x:real);
Function Outre:real;
//методы ввода и вывода значений мнимой части объекта класса Comp
procedure Impim(y:real);
Function Outim:real;
procedure Add(z:comp);
procedure Sub(z:comp);
procedure Mul(z:comp);
end;
Implementation
Procedure Comp.Impre;
begin re:=x;
end;
procedure Comp.Impim;
begin im:=y;
end;
function Comp.Outre;
begin result:=re;
end;
function Comp.Outim;
begin result:=im;
end;
procedure Comp.Add(z:Comp);
begin re:=re+z.re;
im:=im+z.im;
end;
{Комплексное число z (параметр метода) прибавляется к исходному числу объекту класса Comp}
procedure Comp.Sub(z: Comp);
begin re:=re – z.re;
im:=im – z.im;