В настоящее время я пытаюсь понять внутренности итераторов на разных языках, то есть способ их реализации.
Например, существует следующий класс, отображающий интерфейс списка.
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 (friend of List) с защищенными методами, которые могут получить доступ к элементам List. Конкретные реализации Iterator будут обрабатывать задание по-разному и получить доступ к личным и защищенным данным List через базовый интерфейс.
С этого момента все становится запутанным. Скажем, у меня есть класс LinkedList и ArrayList, оба производные от List, и есть также соответствующие итераторы, каждый из классов возвращается. Как я могу реализовать LinkedListIterator? Я абсолютно вне идей. И какие данные могут получить базовый класс итератора из списка (который является простым интерфейсом, в то время как реализации всех производных классов значительно отличаются)?