Интерфейсы коллекций
Теперь, достаточно подробно обсудив концепцию интерфейсов, мы можем обратить более пристальный взгляд на коллекции, в частности, на класс ArrayList (Список массивов), который мы активно использовали в программе Бюро путешествий Acme (Acme Travel Agency). Присмотревшись к определению класса ArrayList (Список массивов), можно увидеть, что он реализует четыре стандартных интерфейса.
// класс сборщика мусора ArrayList _gс class ArrayList: public IList, ICollection, lEnumerable, ICloneable
Первые три образуют несложную иерархическую структуру, показанную на рис. 5.1. При продвижении по структуре в интерфейсах появляются дополнительные методы, и, наконец, IList имеет наиболее полный их набор.
Рис. 5.1. Иерархия интерфейсов для списков
Четвертый интерфейс из реализованных в ArrayList (Список массивов), ICloneable, является независимым от первых трех и предназначен для осуществления детального копирования объектов. Для знакомства с интерфейсами, обеспечивающими работу с коллекциями, рассмотрим программу StringList. Просмотрите главный метод Main программы StringList, а вспомогательные методы будут подробно рассматриваться по мере нашего знакомства с разными интерфейсами, предназначенными для работы с коллекциями.
//StringList.h _gc class StringList // класс сборщика мусора StringList { private: // частный static ArrayList *pList; // статический public: static void Main() // статический Главный { // Инициализировать строки и показать начальное состояние pList = new ArrayList(4); ShowCount(); AddStringC'Amy"); // Эми AddStringC'Bob"); // Боб AddString("Charlie"}; // Чарли ShowEnum(pList);// счетчик ShowCount (); // Добавить еще две строки и снова показать состояние AddString("David"); //Дэвид AddString("Ellen"); // Эллен ShowList(pList);// моделировать foreach ShowCount (}; // Удалить две строки из списка и показать состояние RemoveString("David"); // Дэвид RemoveAt(0); ShowArray(pList);// запись индекса ShowCount(); // Попытка удалить две строки, которых нет в списке RemoveString("Amy"); // Эми RemoveAt(3); } private: // частный static void ShowEnum(ArrayList *pArray) // статическая функция { lEnumerator *plter = pArray › GetEnumerator(); bool more = p!ter › MoveNext(); while (more) { String *pStr = dynamic_cast<String *>((p!ter › Current)); Console::WriteLine(pStr); more = p!ter › MoveNext(); } }