По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Объектно-ориентированное программирование
9.2 Инкапсуляция
Инкапсуляция — один из важнейших механизмов объектно-ориентированного программирования (наряду с наследованием и полиформизмом). Класс представляет собой единство трёх сущностей: полей, свойств и методов, что и представляет собой инкапсуляцию. Инкапсуляция позволяет создавать класс как нечто целостное, имеющее определённую функциональность. Например, класс TForm содержит в себе (инкапсулирует) всё необходимое, чтобы создать диалоговое окно.
Основная идея инкапсуляции — защитить поля от несанкционированного доступа. Поэтому поля целесообразно объявлять в разделе private. Прямой доступ к полям объекта — чтение и обновление их содержимого — должны производиться посредством вызова соответствующих методов. В FreePascal для этого служат свойства класса.
Свойства — это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, read и write. Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Синтаксис объявления свойств следующий:
propety имя_свойства : тип read имя_чтения write имя_записи
Зарезервированное слово read описывает метод чтения свойств объекта, а слово write описывает метод записи свойств объекта. Имя_чтения и имя_записи — соответственно имена методов, обеспечивающих чтение или запись свойства.
Если необходимо, чтобы свойство было доступно только для чтения или только для записи, следует опустить соответственно часть write или read.
Рассмотрим следующий пример. Создадим класс "многоугольник", задав ему имя TPolygon. Полями класса будут:
- K — количество сторон многоугольника;
- p — массив, в котором будут храниться длины сторон многоугольника
Методами класса будут:
- конструктор Create, обнуляющий элементы массива p;
- Perimetr() — функция вычисления периметра фигуры;
- Show() — функция формирования сведений о фигуре (количество сторон и периметр);
- Set_Input() — функция проверки исходных данных.
Расположим на форме кнопку и метку. При щелчке по кнопке появляется окно ввода количества сторон многоугольника. Если количество сторон введено корректно, то инициализируется объект "Многоугольник" с количеством сторон, равным введённому, в противном случае количество сторон многоугольника по умолчанию принимается равным 50. После этого вычисляется периметр фигуры, и результаты выводятся на форму в метке Label1.
Ниже приведён листинг программы с комментариями, результаты работы программы можно увидеть на рис. 9.2.
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class (TForm) Button1 : TButton; Label1 : TLabel; procedure Button1Click ( Sender : TObject ); private { private declarations } public { public declarations } end; type //объявление класса "многоугольник" TPolygon TPolygon = class //Закрытые поля. Private K : integer; p : array of real; //открытые методы Public constructor Create; //конструктор function Perimetr ( ) : real; //метод вычисления периметра function Show ( ) : String; //метод //защищенные методы Protected procedure Set_Input (m: integer ); //процедура проверки данных Published //Объявление свойства n. //Свойство n оперирует полем K. //В описании свойства после слова read //стоит имя поля - K. Это значит, что //функция чтения отсутствует и пользователь //может читать непосредственно значение поля. //Ссылка на функцию Set_Input после //зарезервированного слова write означает, //что с помощью этой функции в поле K будут //записываться новые значения. Property n : integer read K write Set_Input; end; var Form1 : TForm1; //объявление переменной типа класс многоугольник Figu re : TPolygon; implementation //Описание конструктора. constructor TPolygon. Create; var i : integer; begin K:= 50; //Присваивание начальных значений полям. //выделение памяти под массив p SetLength ( p,K); for i :=0 to K -1 do p [ i ] : = 0; inherited Create; end; //Функция вычисления периметра. function TPolygon. Perimetr ( ) : real; var Sum: real; i : integer; begin Sum: = 0; for i :=0 to K -1 do Sum:= Sum +p [ i ]; Perimetr :=Sum; end; //Метод формирования сведений о фигуре. function TPolygon. Show ( ) : String; begin Show:= ’Многоугольник с количеством сторон ’+ IntToStr (K)+ chr (13)+ ’Периметр = ’+ FloatToStr ( Perimetr ( ) ) end; //Метод записи данных в поле K. procedure TPolygon. Set_Input (m: integer ); begin //Если введённое значение положительное число, //то записать его в поле K, //иначе вернуться к начальному значению. if m>1 then K:=m else K:= 50; end; {TForm1 } //Обработка события. procedure TForm1. Button1Click ( Sender : TObject ); var i, m: integer; s : string; begin //ввод количества сторон многоугольника s := InputBox ( ’Ввод ’, ’Введите количество сторон многоугольника ’, ’ 6 ’ ); Val ( s,m); Figu re :=TPolygon. Create; //инициализация объекта with Figure do begin //метод проверки исходных данных Set_Input (m); //формирование массива случайных чисел for i :=0 to K _1 do p [ i ] : = random ( 5 0 ); //обращение к методу вычисления периметра s :=Show ( ); end; Label1. Caption := s; //вывод результатов в окно формы end; initialization {$I unit1.lrs} end.