зачем нужен интерфейс IteratorAggregate

Ltvjy

Новичок
зачем нужен интерфейс IteratorAggregate

Всем доброго времени суток.
Есть интерфейсы Iterator и IteratorAggregate, ну первый понятно нужен для распечатки объекта в цикле. Но зачем нужен IteratorAggregate ведь класс который его реализует всего лишь создает объект и возращает его??? Это же можно сделать в классе реализующем Iterator.
 

atv

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

Класс, реализующий IteratorAggregate, позволяет проводить по нему несколько независимых итераций.
 

Ltvjy

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

atv

Новичок
PHP:
class Foo implements Iterator {
    // объявление необходимых методов
}
class Bar implements IteratorAggregate {
    function getIterator() {
        return new Foo;
    }
}

$foo = new Foo;
$bar = new Bar;

foreach ($foo as $value) {
    foreach ($foo as $value) {
        // этот вложенный цикл зависит от внешнего
        // и поведение этого кода бeдет НЕ ожидаемым
    }
}

foreach ($bar as $value) {
    foreach ($bar as $value) {
        // этот вложенный цикл НЕ зависит от внешнего
        // и поведение этого кода будет ожидаемым
    }
}
 

Ltvjy

Новичок
class Foo implements Iterator {
// объявление необходимых методов
}


$foo1 = new Foo;
$foo2 = new Foo;

foreach ($foo1 as $value) {
foreach ($foo2 as $value) {


}
}

Тоже самое но без IteratorAggregate.
 

atv

Новичок
$foo1 и $foo2, это разные экземпляры класса. Если ты хочешь с ними работать как с одним объектом, то тебе придётся поддерживать их идентичность. Любые изменения в одном нужно будет дублировать и в другом.
 
Сверху