Лекция 17. Семейства. Индексаторы

 

В предыдущем семестре рассматривался особый тип - массивы для создания таких типов переменных, в которых содержится несколько объектов или значений. У массивов, однако, имеются определенные ограничения. Наиболее существенным из них является то, что после создания массива его размеры должны оставаться неизменными, поэтому дописывать новые элементы в конец уже существующего массива нельзя — требуется создавать новый массив. Методы ООП позволяют создавать классы, которые выполняют существенную часть этих манипуляций внутренним образом, упрощая тем самым код, в котором используются списки элементов или массивы.

Массивы в С# реализованы как экземпляры класса System.Array и представляют собой один из тех типов, которые известны под названием классов семейств.

Семейства— это объекты, в которых могут содержаться массивы других объектов и которые обладают функциональными возможностями для организации доступа к ним.

Классы семейств используются для работы со списками объектов и по сравнению с обычными массивами обладают некоторыми дополнительными функциональными возможностями. Эти возможности возникают за счет реализации интерфейсов из пространства имен System.Сollections, что позволяет стандартизировать синтаксис семейств. В пространстве имен содержатся также и некоторые другие интересные вещи, например, классы, которые реализуют интерфейсы отличными от класса System.Array способами.

Функциональные возможности семейств такие как доступ к членам семейств с использованием синтаксиса [индекс], реализуются посредством интерфейсов. У программистов имеется возможность создавать свои собственные классы семейств. Такие классы могут соответствовать объектам, с которыми их планируется использовать (т. е. тем объектам, из которых планируется создавать семейство). Одно из преимуществ такого подхода заключается в том, что создаваемые классы семейств могут быть строго типизированы.Это означает, что при извлечении элементов из семейства не требуется приводить их типы к требуемому типу.

В пространстве имен System.Collections существуют интерфейсы, которые обеспечивают выполнение базовых функциональных возможностей семейств:

Интерфейс IEnumerable - позволяет просматривать элементы семейств в цикле.

Интерфейс ICollection - позволяет получать общее число элементов в семействе, а также копировать элементы семейства в обычный массив.

Интерфейс IList - предоставляет список элементов семейства и доступ к этим элементам, а также некоторые другие базовые возможности, имеющие отношение к работе со списками элементов.

Интерфейс IDictionary аналогичен интерфейсу IList, но предоставляет список элементов, доступ к которым осуществляется не с помощью индекса, а посредством некоторого ключевого значения.

Класс System.Array наследуется от IList, ICollection и IEnumerable, однако он не поддерживает некоторые наиболее мощные возможности интерфейса IList и представляет список элементов только фиксированной длины.