Cтраница 4
Метод фабрики Create Iterator весьма прост. Он создает соответствующий объект-итератор, передавая себя в его конструктор как параметр. Конструктор итератора сохраняет объект дерева для последующих ссылок и инициализирует его позицию в дереве. Следующий код демонстрирует метод фабрики Create-Ite rator и конструктор для базового класса TIterator. [46]
![]() |
Использование итератора для косвенной связи со списком. [47] |
Итератор ( iterator) обеспечивает альтернативный метод обхода элементов в объекте агрегата. Объект итератора обращается к агрегату для обхода его элементов и определяет порядок, в котором проверяются эле менты. Множество классов итератора может быть сопоставлено с классом агрегата, чтобы обеспечить различный порядок обход а эле ментов. [48]
В этом примере итераторы и класс дерева также определены в одном модуле. Класс дерева объявляет метод Cre ate Ite rator, который возвращает объект-итератор. Все классы итераторов используют ссылки на класс дерева и должны быть определены в одном объявлении типа, как и все классы Delphi, которые содержат циклические ссылки друг на друга. [49]
Обычно с классом-коллекцией ассоциируют объекты-итераторы, или просто итераторы. Итератор - это объект, который возвращает следующий элемент коллекции. После реализации итератора класса несложно написать выражение для получения следующего элемента контейнера. Итераторы пишут в виде друзей классов, для которых они выполняют итерации. Подобно тому, как книга, которую читают одновременно несколько читателей, может одновременно содержать несколько закладок, на контейнерном классе может действовать сразу несколько итераторов. [50]
![]() |
Использование итератора для косвенной связи со списком. [51] |
Итератор должен знать порядок записи элементов, чтобы определить последовательность их обхода. Если агрегат - это связанный список, то объект итератора должен знать, что элементы сохранены в связанном списке, иуметьпо этому списку перемещаться. Так как итератору известны детали внутренней организации списка, он нарушает инкапсуляцию агрегата. [52]
Такие устройства имеют в своем составе средства распознавания речевых сигналов ( S. Некоторые из них способны распознавать и произносить слова из предварительно определенного словаря, другие настраиваются на определенного диктора. При произнесении итератором какого-либо словарного слова соответствующее ему символьное отображение выводится на экран и может быть проконтролировано. Процесс распознавания речи основывается на сопоставлении речевого фрагмента со словами их хранимой словарной таблицы. Таблица формируется и модифицируется е использованием средств визуального отображения, снабженных клавиатурой. Для этого элемент данных или системная команда записывается б память и соответствующее слово произносится несколько раз. Произнесенное слово затем анализируется и преобразуется в определенную двоичную комбинацию, которая запоминается в словарной таблице. [53]
Многие классы применяются совместно с другими. Например, класс-итератор тесно взаимодействует с классом агрегатом. Чтобы выполнить свою задачу, итератор должен наруишть инкапсуляцию агрегата. Хотя для этих связанных классов такое иногда допустимо, другие классы этого делать не должны. [54]
Несмотря на то, что продукционные правила обеспечивают достаточную гибкость для описания реакций системы на изменения окружающего мира, в некоторых случаях, когда необходимо выполнить жесткую последовательность действий ( например, запуск или остановку комплекса оборудования), более предпочтительным является процедурный подход. Язык программирования, используемый в G2 для представления процедурных знаний, является достаточно близким родственником Паскаля. Еще одна интересная особенность языка - итераторы, позволяющие организовать цикл над множеством экземпляров класса. Перечисленные свойства языка позволяют системе одновременно выполнять множество различных процедур или множество копий одной и той же процедуры для множества различных объектов. [55]
![]() |
Использование итератора для косвенной связи со списком. [56] |
Вместо того чтобы каждый класс, который должен проверять элементы агрегата, реализовывал обход самостоятельно, можно сопоставить класс-итератор с классом-агрегатом. Итератор должен содержать простые процедуры MoveFirst ( Переместиться в начало), MoveNext ( Переместиться на следующий элемент), EndOfList ( Переместиться в конец списка) и Cut rent Item ( Текущий элемент), чтобы обеспечить косвенный до ступ к списку. Новые классы могут включать в себя экземпляр класса итератора и использовать его методы для обхода элементов агрегата. [57]