|
Программирование >> Программирование с использованием ajax
Console.WriteLine( Using custom collection class Animals: ); Использование специальной коллекции Animals Animals animalCollection = new Animals(); animalCollection.Add(new Cow( Sarah )); foreach (Animal myAnimal in animalCollection) { Console.WriteLine( New {0} object added to custom collection, + Name = {1} , myAnimal.ToString (), myAnimal.Name); Однако делать так нельзя: animalCollection[О].FeedO ; Для получения доступа к элементам через их индексы подобным образом, необходимо использовать индексатор. Индексаторы Индексатор (indexer) - это свойство особого вида, которое можно добавлять в класс для обеспечения подобного массивам доступа. На самом деле с помощью индексатора можно обеспечивать и гораздо более сложный доступ, поскольку с ним в квадратных скобках можно определять и использовать параметры любых сложных типов. Реализация простого числового индекса для элементов, однако, является наиболее распространенным способом его применения. Добавить индексатор в состоящую из объектов Animal коллекцию Animals можно следующим образом: public class Animals : CollectionBase { public Animal this [int animallndex] { get { return (Animal)List[animallndex]; set { List[animallndex] = value; Здесь используется ключевое слово this вместе со следующими далее в квадратных скобках параметрами, но весь остальной код выглядит во многом точно так же, как и код любого другого свойства. Такой синтаксис логичен, поскольку позволяет осуществлять доступ к индексатору с использованием имени объекта со следующим далее в квадратных скобках и указывающим на индекс параметром или параметрами (например, MyAnimals [0]). В следующем коде индексатор применяется на свойстве List (т.е. на интерфейсе IList, который обеспечивает в CollectionBase доступ к ArrayList, в котором и хранятся элементы): return (Animal)List[animallndex]; Явное приведение здесь является обязательным, поскольку свойство IList.List возвращает объект System.Object. Здесь важно обратить внимание на то, что тип определяется для индексатора. Именно он будет получаться при доступе к элементу с помощью данного индексатора. Это означает, что можно использовать такую строку кода: animalCollection[О].Feed(); вместо такой: ((Animal)animalCollection[0]).Feed(); Это является еще одной полезной возможностью строго типизированных специальных коллекций. В следующем практическом занятии предыдущий пример расширяется, чтобы позволить испытать все это на практике Пр81СГИЧв0К0в MHeiHglJJJJgg 1. Создайте новое консольное приложение по имени ChllEx02 и сохраните его в каталоге С: \BegVCSharp\Chapterll. 2. Щелкните правой кнопкой мыши на имени этого проекта в окне Solution Explorer и выберите в контекстном меню пункт AddiAdd Existing Item (Добавить=> Добавить существующий элемент). 3. Выберите из каталога C:\BegVCSharp\Chapterll\ChllEx01\ChllEx01 файлы Animal. cs. Cow. cs и Chicken. cs и щелкните на кнопке Add (Добавить). 4. Измените объявление пространства имен в каждом из трех добавленных файлов следующим образом: namespace ChllEx02 5. Добавьте новый класс с именем Animals. 6. Измените код в файле Animals . cs следующим образом: using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; #endregion namespace ChllEx02 { public class Animals : CollectionBase public void Add (Animal newAnimal) List. Add (newAnimal) ; public void Remove (Animal newAnimal) List.Remove(newAnimal); public Animals () public Animal this [int animallndex] { get { return (Animal)List[animallndex]; List[animallndex] = value; 7. Измените код в файле Program, cs следующим образом: static void Main(string[] args) { Animals animalCollection = new Animals () ; animalCollection. Add (new Cow( Jack )) ; animalCollection. Add (new Chicken ( Vera )) ; foreach (Animal myAnimal in animalCollection) { myAnimal.Feed(); Console.ReadKey(); 8. Запустите приложение. На рис. 11.2 показан результат, который должен получиться. Рис. 11.2. Приложение ChllEx02 в действии Описание полученных результатов в этом примере код, описанный в предыдущем примере, используется для реализации строго типизированной коллекции объектов Animal в классе по имени Animals. В коде внутри Main() просто создается экземпляр объекта Animals под названием animalCollection, добавляется два элемента (представляющие собой экземпляры Cow и Chicken) и применяется цикл foreach для вызова метода FeedO , который оба объекта наследуют от своего базового класса Animal. Добавление коллекции Cards в CardLib в предыдущей главе вы создавали проект библиотеки классов ChlOCardLib, который состоял из класса Card, представлявшего игральную карту, и класса Deck, представлявшего колоду карт, т.е. из коллекции классов Card. Там эта коллекция была реализована в виде простого массива. В этой главе вы переименуете эту библиотеку в ChllCardLib и добавите в нее новый класс. Этот новый класс будет носить имя Cards и является специальной коллекцией объектов Card, предоставляющей все описанные ранее преимущества. Чтобы сделать это, сначала создайте новый проект библиотеки классов по имени ChllCardLib, сохраните его в каталоге C:\BegVCSharp\Chapterll, выберите в меню Project (Проект) пункт Add Existing Item (Добавить существующий элемент), отыщите в каталоге C:\BegVCSharp\ChapterlO\ChlOCardLib\ChlOCardLib файлы Card.cs, Deck.cs, Suit .CS и Rank.cs и добавьте их в проект ChllCardLib. Как и в предыдущей версии данного проекта (см. главу 10), шаги для внесения изменений приводятся здесь
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |