Лабораторная работа 1 по ООАИП


Лабораторная работа 1. Классы и объекты.
Класс – это определяемый пользователем тип данных, имеющий состояние (его представление или внутренние данные) и ряд операций (его поведение или методы).
Объект – это экземпляр класса или переменная типа данных, определенного этим классом.
Классы определяются в разделе type файла исходного кода. Например,
typeTMyClass = class
end;
Здесь объявлен новый класс с названием TMyClass. Если не указано иного, то любой созданный класс по-умолчанию наследуется от базового класса TObject. Чтобы указать, что создаваемый класс должен наследоваться от другого класса, необходимо в скобках после имени класса указать родительский класс.
typeTMyClass = class(TParentClass)
end;
В данном примере класс TMyClass наследован от TParentClass (подробнее наследование разбирается далее).
Создадим класс TMyShape, который будет представлять базовый класс для геометрических фигур.
typeTMyShape = class
end;
Этот класс будет наследован от TObject, так как нам не нужно никакой другой реализации от этого класса, кроме самой базовой, предоставляемой TObject. Пока этот класс ничего не делает, но благодаря тому, что он наследован от TObject, можно создавать его экземпляры. Создадим объект класса TMyShape. Для этого в секции var поместим название переменной, например, shape1:
VarShape1: TShape;
Для создания экземпляра класса необходимо в коде вызвать специальный метод класса – конструктор. После окончания работы с объектом его необходимо удалить, вызвав деструктор.
Shape1 := TMyShape.Create; //вызов конструктора
Shape1.Free; // вызов деструктора
После вызова конструктора будет выделено соответствующее количество памяти для хранения объекта, и переменная shape1 будет указывать на объект типа TMyShape.
После вызова деструктора память, занятая объектом shape1 будет освобождена.
Значение одной объектной переменной можно присвоить другой. При этом объект не копируется в памяти, а вторая переменная просто связывается с тем же объектом, что и первая:
var shape1, shape2: TMyShape;
begin
Shape1 := TMyShape.Create;
Shape2 := Shape1;
Shape1.Free;
end;
Объекты могут выступать в программе не только в качестве переменных, но также элементов массивов, полей записей, параметров процедур и функций. Кроме того, они могут служить полями других объектов. Во всех этих случаях программист фактически оперирует указателями на экземпляры объектов в динамической памяти. Следовательно, объекты изначально приспособлены для создания сложных динамических структур данных, таких как списки и деревья.
Инкапсуляция.
Класс может содержать большое количество данных и любое число методов. Однако для соблюдения объектно-ориентированного подхода данные должны быть скрыты или инкапсулированы внутри использующего их класса.
Delphi использует три спецификатора доступа для определения уровня сокрытия данных: private, public, protected.
Private – поля и методы класса, которые недоступны извне модуля, объявляющего этот класс;
Protected – поля и методы с ограниченной видимостью;
Public – поля и методы, свободно доступные для любого раздела программы.
Четвертый вид published управляет информацией времени разработки и RTTI информацией, давай уровень видимость, аналогичный public.
Новые версии Delphi содержат также спецификатор strict private – строгие приватные члены, доступные только внутри класса.
Свойства.
Свойства являются важными частями объектно-ориентированного подхода, позволяющие давать опосредованный доступ к полям класса. Часто фактические данные и методы доступа являются частными (private) или защищенными (protected), в то время как свойство – опубликованным (public).
Добавим в класс TMyShape свойство Kind, определяющее тип фигуры:
typeTMyClass = class(TParentClass)
Private
FKind: String; // определение поля
Public
Property Kind: String read FKind; // свойство
end;
Это свойство только для чтения, так как для него определен только способ чтения этого свойства: read FKind. Чтобы сделать свойство и для чтения и для записи необходимо написать способ записи данных с помощью директивы write:
TMyClass = class(TParentClass)
Private
FKind: String;
Public
Property Kind: String read FKind write FKind;
end;
Способ чтения и установки значения свойства могут быть не просто способом доступа к скрытому полю, но и методами класса, соответственно при установке и чтении свойства будут вызываться соответствующие методы:
TMyClass = class(TParentClass)
Private
FKind: String;
Public
Property Kind: String read GetKind write SetKind;
end;
В данном случае GetKind и SetKind – методы чтения и установки значения свойства Kind соответственно.
Синтаксис просмотра и установления значения свойства: имя_объекта.свойство, например,
Shape1.Kind := ‘фигура’;
ShowMessage(Shape1.Kind);
Создадим новый класс TRectangle, представляющий собой прямоугольник. Для него необходимо определить две характеристики: длину и ширину.
TRectangle = class
private FWidth: Integer;
FHeight: Integer;
procedure SetHeight(const Value: Integer);
procedure SetWidth(const Value: Integer);
public property Width: Integer read FWidth write SetWidth;
property Height: Integer read FHeight write SetHeight;
function Square: Integer; // метод для расчета площади
// прямоугольника
end;
Реализация методов для свойств в классе может быть выполнена автоматически, с помощью комбинации клавиш Ctrl + Shift + C, а также IDE добавит заготовки для других методов.
{ TRectangle }
procedure TRectangle.SetHeight(const Value: Integer);
begin FHeight := Value;
end;
procedure TRectangle.SetWidth(const Value: Integer);
begin FWidth := Value;
end;
function TRectangle.Square: Integer;
begin Result := Width * Height; // этот код добавлен вручную
end;
Задание.
Создайте экземпляр класса TRectangle, задайте ему значения ширины и высоты = 60 и 40 соответственно, и выведите с помощью функции ShowMessage его площадь.
Создайте класс TCircle, реализующий окружность. Класс должен иметь свойство Radius – радиус окружности и методы Square, CircleLength для расчета площади и длины окружности соответственно. (формулы: Pi*R*R, 2*Pi*R)
Создайте в классе TCircle свойство только для чтения Diameter, возвращающее диаметр окружности.
Конструктор
До этого мы вызывали конструктор по-умолчанию, доставшийся от родителя TObject, однако, мы можем создать свой конструктор для класса. Например, было бы логично сразу инициализировать значения длины и ширины прямоугольника или радиус окружности. Конструктор начинается с ключевого слова constructor, после которого ставится слово Create(параметры). В конструкторы мы можем предусмотреть специальные действия, необходимые для установки свойств объекта и/или создания всех необходимых объектов. Для нашего примера запишем:
TRectangle = class
private FWidth: Integer;
FHeight: Integer;
procedure SetHeight(const Value: Integer);
procedure SetWidth(const Value: Integer);
public property Width: Integer read FWidth write SetWidth;
property Height: Integer read FHeight write SetHeight;
function Square: Integer;
constructor Create(Width, Heigth: Integer); // конструктор
end;
Конструктор принимает параметры длины и ширины прямоугольника и инициализирует соответствующие поля:
constructor TRectangle.Create(Width, Heigth: Integer);
begin FWidth := Width;
FHeight := Heigth;
end;
Теперь создание объекта необходимо выполнять следующим образом:
Shape1 := TRectangle.Create(50, 40);
Вызывать конструктор без параметров в этом случае уже нельзя, так как написанный нами конструктор заменил базовый конструктор. Если это необходимо, то класс может иметь несколько конструкторов, тогда можно вызывать любой из них в зависимости от ситуации.
Деструктор.
Для освобождения занятой объектом памяти служит деструктор. В отличие от конструкторов, собственные деструкторы нужны только в том случае, если объекты запрашивает внешние ресурсы, например, создает другие внутренние объекты. Пример деструктора:
Destructor Destroy; override;
Задание
Создайте конструктор для класса TCircle, принимающий параметр радиус окружности и присваивающий его соответствующему полю.

Приложенные файлы

  • docx 9516289
    Размер файла: 22 kB Загрузок: 0

Добавить комментарий