Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
03 Лаб-работа.pdf
Скачиваний:
22
Добавлен:
13.04.2015
Размер:
212.18 Кб
Скачать

Лабораторнаяработа№3 ИЕРАРХИЯОБЪЕКТОВИГРУППА

Цель. Получить практические навыки создания объектов-групп.

Основныетеоретическиесведения. Иерархияобъектов.

Иерархия классов есть иерархия по принципу наследования, т.е. типа “это есть разновидность того”. Например, “рабочий есть разновидность персоны”, “автомобиль” есть разновидность “транспортного средства”. В отличие от этого иерархия объектов − это иерархия по принципу вхождения, т.е. типа “это есть часть того”. Например, “установка − часть завода”, “двигатель” − часть “автомобиля”. Таким образом, объекты нижнего уровня иерархии включаются в объекты более высокого уровня, которые являются для них группой.

Группа.

Группа это объект, в который включены другие объекты. Объекты, входящие в группу, называются элементами группы. Элементы группы, в свою очередь, могут бытьгруппой.

Примерыгрупп:

1.Окно в интерактивной программе, которое владеет такими элементами, как поля ввода и редактирования данных, кнопки, списки выбора, диалоговые окна и т.д.

2.Агрегат, состоящий изболеемелких узлов.

3.Огород, состоящий из растений, системы полива и плана выращивания.

4.Некая организационная структура (например, ФАКУЛЬТЕТ, КАФЕДРА, СТУДЕНЧЕСКАЯГРУППА).

иерархия классов,

иерархию объектов (иерархию типа

целое/часть), построеннуюнаосновеагрегации. Реализоватьгруппуможнонесколькимиспособами:

1. Класс “группа” содержит поля данных объектного типа. Таким образом, объект “группа” в качестве данных содержит либо непосредственно свои элементы,

либоуказатели на них type

TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit;

Button1: TButton; ….

end;

Такойспособреализациигруппыиспользуется вDelphi для работы с компонентами.

2.Класс группа содержит объекты в виде списка указателей. Для языка Delphi удобно использовать класс TList. TList определяет список указателей, который может

использоваться для хранения объектов любого класса. TList более удобен, чем динамический массив, поскольку его можно автоматически расширить, добавив в него новые пункты. Преимущество динамического массива заключается в том, что он позволяет указывать тип помещаемых объектов и выполнять проверку типов во время компиляции. Списки имеют множество методов и свойств. Как для чтения, так и для изменения элементов можно использовать нотацию, используемую в массивах ([ и ]). Существует свойство Count, а также типичные методы доступа,

например Add, Insert, Delete, Remove; методы поиска (например, IndexOf); и

поддержка сортировки. Класс TList имеет метод Assign, который помимо копирования исходных данных может исполнять ряд операций в отношении двух списков, включая and, or и хог.

Рассмотрим пример использования списка объектов «геометрическая точка». (Полностью файлы проекта находятся в архиве objects_in_tlist.zip)

Type

TMyPixel = class FX: Integer; FY: Integer; FText: Integer;

constructor Create(X, Y, Num: Integer); procedure SetPixel;

end;

type

TMainForm = class(TForm) ListBtn: TBitBtn; ClearBtn: TBitBtn; DelBtn: TBitBtn; SortBtn: TBitBtn;

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ListBtnClick(Sender: TObject); procedure ClearBtnClick(Sender: TObject); procedure DelBtnClick(Sender: TObject); procedure SortBtnClick(Sender: TObject); private

PixList: TList; PixNum: Integer; public

{ Public declarations } end;

var

MainForm: TMainForm;

implementation

{$R *.dfm}

const PixColor = clRed;

var CurPixel: TMyPixel;

constructor TMyPixel.Create(X, Y, Num: Integer); begin

inherited Create;

FX := X;

FY := Y; FText := Num; SetPixel;

end;

procedure TMyPixel.SetPixel; begin

MainForm.Canvas.PolyLine([Point(FX, FY), Point(FX, FY)]); MainForm.Canvas.TextOut(FX + 1, FY + 1, IntToStr(FText)); end;

function PixCompare(Item1, Item2: Pointer): Integer; var Pix1, Pix2: TMyPixel;

begin

Pix1 := Item1;

Pix2 := Item2;

Result := Pix1.FX - Pix2.FX; end;

procedure TMainForm.FormCreate(Sender: TObject); begin

PixList := TList.Create; PixNum := 1; {Счетчик точек} end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin

PixList.Free; end;

procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

PixList.Add(TMyPixel.Create(X, Y, PixNum)); Inc(PixNum);

end;

procedure TMainForm.ListBtnClick(Sender: TObject); var i: Integer;

begin

with PixList do

for i := 0 to Count - 1 do begin

CurPixel := Items[i];

CurPixel.SetPixel; end;

end;

procedure TMainForm.ClearBtnClick(Sender: TObject); begin

Canvas.FillRect(Rect(0, 0, Width, Height)); end;

procedure TMainForm.DelBtnClick(Sender: TObject); begin

PixList.Clear;

PixNum := 1; end;

procedure TMainForm.SortBtnClick(Sender: TObject); var i: Integer;

begin

PixList.Sort(PixCompare); with PixList do

for i := 0 to Count - 1 do TMyPixel(Items[i]).FText := i + 1; end;

end.

3. (Для усложненного задания)

Создается связанный списокструктуртипаTItem: struct TItem {TMyObject * item;

TItem* next;};

Поле item указывает на объект, включенный в группу. Группа содержит поле last типа TItem *, которое указывает на начало связанного спискаструктур типаTItem.

Если необходим доступ элементов группы к ее полям и методам, объект типа TMyObject должен иметь поле owner типа TGroup*, которое указываетнасобственника этого элемента.

Методыгруппы.

Имеется два метода, которые необходимы для функционирования группы:

1)void Insert(TMyObject * p);

Вставляетэлементвгруппу.

2)void Show();

Позволяетпросмотретьгруппу.

Кроме этогогруппаможетсодержать следующие методы:

1) int Empty();

Показывает, есть ли хотя бы один элемент в группе.

2) TMyObject * Delete(TMyObject * p);

Удаляет элемент из группы, но сохраняет его в памяти.

3) void DelDisp(TMyObject * p);

Удаляет элемент из группы и из памяти.

Для данного способа реализации группы большое значение имеют итераторы Итераторы позволяют выполнять некоторые действия для каждого

элементаопределенногонабораданных.

For all элементов набора{ действия}

Такой цикл мог бы быть выполнен для всего набора, например, чтобы напечатать все элементы набора, или мог бы искать некоторый элемент, который удовлетворяет определенному условию, и в этом случае такой цикл может закончиться, как только будетнайден требуемый элемент.

Мы будем рассматривать итераторы как специальные методы классагруппы, позволяющие выполнять некоторые действия для всех объектов, включенных в группу. Примеромитератораявляется метод Show.

Нам бы хотелось иметь такой итератор, который позволял бы выполнять над

всеми элементами группы действия, заданные не одним из методов объекта, а произвольной функцией пользователя. Такой итератор можно реализовать, если эту функцию передавать ему через указатель на функцию.

Определим тип указателя на функцию следующим образом: typedef void(*PF)(TMyObject *,< дополнительныепараметры>);

Функция имеет обязательный параметр типа TMyObject или TMyObject *, через который ей передается объект, для которого необходимо выполнить определенныедействия.

Метод-итераторобъявляетсяследующимобразом:

void TGroup::ForEach(PF action,< дополнительныепараметры>);

где action единственный обязательный параметр-указательна функцию, которая вызываетсядлякаждого элементагруппы;

дополнительные параметры передаваемые вызываемой функции параметры. Затем определяется указатель на функцию и инициализируется передаваемой

итераторуфункцией.

PF pf=myfunc;

Тогда итератор будет вызываться, например, для дополнительного параметра типа int, так:

gr.ForEach(pf,25);

Здесьgr объект-группа.

Порядоквыполненияработы.

1. Дополнить иерархию классов лабораторной работы № 2 классами

“группа”.

 

 

 

 

Например,

для

предметной

области ФАКУЛЬТЕТ можно предложить

классы “факультет”,

студенческая

группа”, “кафедра”. Рекомендуется

создать

абстрактный класс

подразделение”, который будет предком всех

групп и

абстрактный класс TMyObject , находящийся во главе всей иерархии.

2.Написать процедуру или функцию, которая выполняется для всех объектов, входящих вгруппу (смотри примерывприложении).

3.Написать демонстрационную программу, в которой создаются, показываются

иразрушаются объекты-группы, а также демонстрируется использование произвольной выборки по заданному условию. При разработке программы использовать визуальные компоненты Delphi (можно C++ или C#).

Методическиеуказания.

1. Класс-группа должен соответствовать иерархии классов лабораторной работы № 2, т.е. объекты этих классов должны входить в группу.

Например, для варианта 1 может быть предложена следующая иерархия классов:

TMyObject (абстр. класс)

Персона(абстр. класс) Подразделение(абстрактнаягруппа)

Студент Преподаватель

Кафедра

Студенческаягруппа

Завкафедрой

Факультет