В настоящее время я пытаюсь понять суть итераторов в разных языках, то есть в том, как они реализованы.
Например, существует следующий класс, представляющий интерфейс списка.
template<class T>
class List
{
public:
virtual void Insert( int beforeIndex, const T item ) throw( ListException ) =0 ;
virtual void Append( const T item ) =0;
virtual T Get( int position ) const throw( ListException ) =0;
virtual int GetLength() const =0;
virtual void Remove( int position ) throw( ListException ) =0;
virtual ~List() =0 {};
};
Согласно GoF , лучший способ реализовать итератор, который может поддерживать различные виды обхода, - это создать базовый класс Iterator (друг List) с защищенными методами, которые могут обращаться к членам List. Конкретные реализации Iterator будут обрабатывать работу различными способами и получать доступ к закрытым и защищенным данным List через базовый интерфейс.
С этого момента все становится запутанным. Скажем, у меня есть классы LinkedList и ArrayList, оба получены из List, и есть также соответствующие итераторы, каждый из классов возвращает. Как я могу реализовать LinkedListIterator? У меня совершенно нет идей. И какого рода данные базовый класс итератора может извлечь из списка (который представляет собой простой интерфейс, в то время как реализации всех производных классов существенно различаются)?