ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.05.2024

Просмотров: 83

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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 случая:

  1. В описании класса нет свойства, но есть методы чтения (вывода) и записи (ввода) данных в поле объекта.

  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;