Файл: 6. Разработка контейнера на основе адресного списка.pdf
ВУЗ: Университет управления «ТИСБИ»
Категория: Учебное пособие
Дисциплина: Объектно-ориентированное программирование
Добавлен: 20.10.2018
Просмотров: 1033
Скачиваний: 17
class CircleListContainer {
private Posrednik First; // указатель на первый элемент списка
private int ContInf;
public CircleListContainer (int ainf) { First = null ; ContInf = ainf;}
public void Add(Circle aCirc, int ainf)
{ First = new Posrednik (ainf, First, aCirc) ;} // красиво и компактно!
public Circle Delete (int ainf) {…} // удаление
public Circle Search (int aRad) {…} // поиск по радиусу
public void ShowAll ( )
{ Posrednik Temp = First; // вспом. указатель для прохода по списку
while (Temp != null )
{ Temp.GetCirc ( ).Show ( ); // доступ к методу объекта-окружности
Temp = Temp.GetNext ( ); // доступ к адресному полю
} // конец цикла
} // конец метода отображения
public void MoveAll (int ax, int ay ) {…}
}; // конец описания класса
Замечание. В языках Java и C# вместо двух отдельных классов можно
воспользоваться возможностью объявления вложенных классов: класс
«ЭлементCписка» можно объявить внутри класса «СписковыйКонтейнер». В
этом случае доступ к полям данных объектов-элементов можно выполнять
напрямую, без использования методов доступа.
В заключение приведем фрагменты программ, демонстрирующих
использование спискового контейнера.
var MyCont : CircleListContainer;
MyCont := CircleListContainer.Create (…);
MyCirc := TCircle.Create(random(…), random(…), random(…));
MyCont.Add (‘текст’, MyCirc);
// создали и добавили еще несколько окружностей
MyCont.ShowAll;
MyCont.MoveTo (…);
CircleListContainer MyCont = new CircleListContainer (…);
Circle MyCirc = new Circle (. . . . .);
MyCont.Add (MyCirc, 1);
// повторить два последних действия необходимое число раз
MyCont.ShowAll ( );
MyCont.MoveAll (50, 50);
Упрощенная диаграмма классов для спискового контейнера объектов-
окружностей имеет следующий вид:
Класс «СписковыйКонтейнер»
Информация о контейнере
число элементов
адрес первого элемента списка
Конструктор(ы), Методы доступа
Методы добавления, удаления, поиска
Методы-итераторы
1..n
Класс объектов-посредников «ЭлементСписка»
информация
адрес следующего посредника
адрес объекта-окружности
Конструктор
Методы доступа
1..1
Класс информационных объектов-окружностей
Координаты центра
радиус
Конструктор(ы)
Методы доступа
Методы отображения и перемещения
Во втором, более простом варианте класс объектов-посредников не
нужен, но использовать данный способ можно не всегда. В качестве
примера приведем описание (сокращенное) класса «Студент» со
служебным адресным полем.
TStudent = class
private
Fam : string;
NextStud : TStudent;
// служебное связующее поле
. . . . . . . . . .
public
constructor Create (aFam : string;
aNext : TStudent);
function GetNext : TStudent;
// получить ссылку на следующего
procedure SetNext (aStud : TStudent); // изменить ссылку
// остальные методы — как ранее было описано
end;
Класс «СписковыйКонтейнер» для объектов-студентов:
StudListContainer = class
private
infCont : string; // или другой необходимый тип
First : TStudent; // указатель на первого студента в списке
public
сonstructor Create (ainf : string); // конструктор создает пустой список
function GetFirst : TStudent;
procedure Add (aFam : string ); // добавление - в начало списка
function Delete (aFam : string) : boolean; // удаление
function GetStud (aFam : string) : TStudent; // поиск по фамилии
// остальные методы
end;
Реализация метода добавления студента в начало списка:
procedure StudListContainer.Add (aFam : string);
begin First := TStudent.Create (aFam, First);
end;
В свою очередь, объекты-контейнеры сами могут быть элементами
контейнера более высокого уровня: студенческие группы могут
собираться в рамках контейнера «Факультет», объекты-факультеты
могут объединяться на уровне контейнера «Институт» и т. д. При этом
способы объединения могут быть разными, как на основе массивов, так
и на основе адресных связей.