Зачем реализовывать два интерфейса, которые уже расширяют друг друга?

Я пытаюсь понять кое-что о ArrayObject и ArrayIterator классы

ArrayObject: этот класс реализует IteratorAggregate и Traversable интерфейсы. Поскольку IteratorAggregate расширяет саму Traversable, почему ArrayObject реализует и то, и другое, если можно просто реализовать IteratorAggregate?

ArrayIterator: как и выше, этот класс реализует оба Iterator и Traversable, который Iterator расширяет.

Почему эти классы реализуют два интерфейса, когда им может сойти с рук реализация того, который расширяет Traversable?


person Aviel Fedida    schedule 06.07.2012    source источник
comment
Я подозреваю, что эти ссылки здесь только для того, чтобы сделать руководство более ясным и проходимым (ха) - по иронии судьбы в вашем случае это, кажется, имело совершенно противоположный эффект. Я думаю, вы правы в том, что правильнее было бы сказать, что они реализуют интерфейсы IteratorAggregate и Iterator соответственно.   -  person DaveRandom    schedule 06.07.2012
comment
...хотя может показаться, что вы можете написать свой код таким, казалось бы, противоречивым способом, и PHP не будет жаловаться на это.   -  person DaveRandom    schedule 06.07.2012
comment
Я не думаю, что Java тоже будет жаловаться, но не проверял. Это как объявить непроверенные исключения: лишнее, но не ошибка.   -  person David Harkness    schedule 06.07.2012


Ответы (1)


Согласно исходному коду SPL, ArrayObject не t реализовать Traversable напрямую:

class ArrayObject implements IteratorAggregate, ArrayAccess, Countable
{
    ...
}

Это соответствует документации по SPL. Я считаю, что DaveRandom прав.

person David Harkness    schedule 06.07.2012
comment
Я посмотрел ссылку, и похоже, что классы ArrayObject и ArrayIterator не реализуют интерфейс Traversable напрямую, - person Aviel Fedida; 06.07.2012