Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Вариации индексатора для типа Garage

Вариации индексатора для типа Garage

В своем текущем виде тип Gаrage определяет индексатор, который позволяет вызывающей стороне идентифицировать внутренние элементы, используя число-вое значение. Но это не является непременным требованием метода индексатора. Предположим, что объекты Car содержатся в System.Collections.Specialized. ListDictionary, а не в ArrayList. Поскольку типы ListDictionary позволяют доступ к содержащимся типам с помощью ключевых маркеров (таких как, например, строки), можно создать новый индексатор Garage, подобный показанному ниже.

public class Garage: IEnumerable {
 private ListDictionary carDictionary = new ListDictionarу();
 // Этот индексатор возвращает соответствующий тип Car
 // на основе строкового индекса.
 public Car this[string name] {
  get { return (Car)carDictionary[name]; }
  set { carDictionary[name] = value; }
 }
 public int Length { get { return carDictionary.Count; } }
 public IEnumerator GetEnumerator() { return carDictionary.GetEnumerator(); }
}

Вызывающая сторона теперь может взаимодействовать с машинами внутри так, как показано ниже,

public class Program {
 static void Main(string[] args) {
  Console:WriteLine("***** Забавы с индексаторами *****n");
  Garage carLot = new Garage();
  // Добавление именованных машин в гараж.
  carLot["FeeFee"] = new Car("FeeFee", 200, 0);
  carLot["Clunker"] = new Car("Clunker", 90, 0);
  carLot["Zippy"] = new Car("Zippy", 30, 0);
  // Доступ к Zippy.
  Car zippy = carLot["Zippy"];
  Console.WriteLine("{0} едет со скоростью {1} км/ч", zippy.PetName, zippy.CurrSpeed);
  Console.ReadLine();
 }
}

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

Исходный код. Проект StringIndexer размещен в подкаталоге, соответствующем главе 9.

Оглавление книги


Генерация: 1.769. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз