Индексаторы — пример того, как добавленная к языку командой разработчиков небольшая, но мощная функция помогает повысить производительность наших усилий по разработке. Однако, как и у любой функции любого языка, у индексаторов своя область применения. Их нужно использовать только там, где понятно, что с данным объектом можно обращаться, как с массивом. Рассмотрим приложение по подготовке счетов. В нем, конечно, нужен класс
Invoice,
определяющий член-массив объектов
InvoiceDetail.
В таком случае пользователю будет совершенно понятно применение следующего синтаксиса при обращении к подробностям счетов:
InvoiceDetail detail = invoice[2]; // Возвращает 3-ю строку
// с подробностями счета.
Однако этого не скажешь о попытке превращения всех членов
InvoiceDetail
в массив, доступ к которому будет осуществляться через индексатор. Как видите, первая строка гораздо понятнее, чем вторая:
Истина в том, что не стоит делать что-то лишь потому, что это возможно. Или конкретнее: задумывайтесь над тем, как реализация любой новой функции повлияет на клиенты вашего класса, и принимайте исходя из этого решение о том, облегчит ли реализованная функция использование вашего класса, или нет.