Программирование >>  Программирование с использованием ajax 

1 ... 90 91 92 [ 93 ] 94 95 96 ... 396


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), шаги для внесения изменений приводятся здесь



1 ... 90 91 92 [ 93 ] 94 95 96 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика