Иерархия объектов и группа. итераторы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Иерархия объектов и группа. итераторы



Цель.

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

Основные теоретические сведения.

Группа.

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

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

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

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

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

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

Мы отличаем “группу” от “контейнера”. Контейнер используется для хранения других данных. Примеры контейнеров: объекты контейнерных классов библиотеки STL в C++ (массивы, списки, очереди).

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

Группа дает второй вид иерархии (первый вид - иерархия классов, построенная на основе наследования) - иерархию объектов (иерархию типа целое/часть), построенную на основе агрегации.

Реализовать группу можно несколькими способами:

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

class TWindowDialog: public TGroup

  {

   protected: 

  TInputLine input1;

  TEdit edit1;

  TButton button1;

  /*другие члены класса*/

  };

Такой способ реализации группы используется в C++ Builder.

 

2. Группа содержит член-данное last типа TObject*, который указывает на начало связанного списка объектов, включенных в группу. В этом случае объекты должны иметь поле next типа TObject*, указывающее на следующий элемент в списке.

3. Создается связанный список структур типа TItem:

  struct TItem

  {TObject* item;

   TItem* next;};

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

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

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

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

1) void Insert(TObject* p);

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

2) void Show();

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

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

1) int Empty();

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

2) TObject* Delete(TObject* p);

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

3) void DelDisp(TObject* p);

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

 

Иерархия объектов.

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

 

Итератор.

Итераторы позволяют выполнять некоторые действия для каждого элемента определенного набора данных.

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

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

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

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

Определим тип указателя на функцию следующим образом:

typedef void(*PF)(TObject*,< дополнительные параметры>);

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

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

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

где

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

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

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

PF pf= myfunc;

 

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

gr. ForEach(pf,25);

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



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 108; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.25.32 (0.006 с.)