Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 114

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 404 >> Следующая


(

List[animallndex] = value;

)
238 Глав а 11

7. Модифицируйте код в ciassi.es следующим образом:

static void Main(stringП args)

<

Animals animalCollection - new Animals(); anJjaalCollection. Add (new Cow( 'Jack")) I animalCollection.Add(new Chicken!'Vera*))i

Coreach (Animal myAnimal in animalCollection)

I

myAnimal.Feed() ;

)

)

8. Запустите приложение:

t

hi....................... } •. .

¦¦¦ ¦¦¦¦¦¦ I. ... - —.....................— ¦¦¦¦ ! Ill ¦ ¦

Как это работает

В этом примере используется подробно разобранный в предыдущем разделе код, предназначенный для реализации строго типизированного семейства объектов Animal в классе с именем Animals, Код в Main О создает экземпляр объекта класса Animals с именем animalCollection, добавляет в него два элемента (по одному элементу класса Cow и класса Chicken) и использует цикл foreach для вызова метода Feed)), который оба этих объекта наследуют от своего общего базопого класса Animal.

Мастер Add Indexer (добавление индексатора)

В VS существует еще один мастер, используемый в рамках ООП на С#,— Add Indexer. Он располагается в том же месте, где и мастера для добавления свойств, методов и полей (контекстное меню в окне Class View, пункт Add (Add Indexer...). Мастер открывает диалоговое окно, показанное иа рисунке слева.

Мастер Add Indexer позволяет задавать уровень защищенности (в данном случае public, поскольку необходимо, чтобы индексатор был доступен из внешнего по отношению к данному семейству кода) и тип индексатора (в данном случае Animal, поскольку требуется, чтобы индексатор был строго типизирован и возвращал элементы класса Animal). Можно также задавать типы и имена параметров; в настоящем примере мы использовали один параметр типа int с именем animalindex. Наконец, появилась возможность задать какие-либо описатели для данного индексатора: мы можем определить данный индексатор

кГлеЬ I',.:. I*eufj fed-шUi.: ¦1 ¦ | ll,V? IlLPBfl fell -

¦ .111 u Lit ' 'J COO t illUjE

: ¦ tleyMh.ifp'1,, Chap ter 1 I Ch) IEhP2\tiin' Dcbuu Clil lUvOZ.ditt
Дополнительные сведения о классах

239

либо как виртуальный, либо (в случае абстрактного класса) как абстрактный. Если индексатор объявлен как virtual, это означает, что переопределение данного индексатора допускается во всех классах, производных от индексируемого класса,— точно так же, как и переопределение виртуальных методов, с которыми вы познакомились в предыдущей главе. Абстрактные индексаторы ничем не отличаются от виртуальных индексаторов, однако для их реализации ие задается никакого кода — это обязанность возлагается на классы, являющиеся производными от индексируемого класса.

Изображенные выше установки позволяют получить следующую структуру для индексатора класса Animals:

public Animal this(int animalindex)

(

get

{

return nullt

>

set

{

)

>

Заметьте, что наполнение блоков get и set необходимо задавать вручную.

Семейства с доступом по ключу и интерфейс IDictionary

Кроме интерфейса iList, в семействах можно реализовать аналогичный интерфейс IDictionary, который позволяет осуществлять доступ к элементам по значению ключа (напрнмер, по строке с именем) вместо доступа по индексу.

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

Точно так же, как н для индексируемых семейств, в данном случае имеется базовый класс, который можно использовать для упрощения реализации интерфейса IDictionary,— класс DictionaryBase. В этом классе также реализованы интерфейсы I Enumerable н icoilection, что обеспечивает единые для всех семейств основные возможности манипуляций.

Класс DictionaryBase, как и класс CollectionBase, реализует некоторые (но не все) члены, полученные посредством поддерживаемых им интерфейсов. Так же, как и в классе CollectionBase, в нем реализованы методы clear () и Count О, а вот метод RemoveAtO — нет. Эта ситуация объясняется тем, что RemoveAtO —это метод интерфейса IList, и он реализуется для интерфейса IDictionary. Однако IDictionary обладает методом Remove о, являющимся одним из тех методов, которые необходимо реализовать для создаваемых пользователем классов семейств, основанных на классе DictionaryBase.

Следующий код являет собой пример альтернативной версии класса Animals из предыдущего раздела, который на этот раз в качестве базового класса использует класс DictionaryBase. В иего входят методы Add О, Removed и индексатор доступа по ключу:

public class Aninals : Dictionary Base I

public void Add (atring newID, Animal newAnimal) '
240

Глава 11

-
{ Dictionary.Add(newID, newAnimal); )
public void Remove (str ing animallD) { Dictionary.Remove(animallD); )
public Animals 0 )

public Animal thiststring animallD]

(

get

(

return (Animal)Dictionary[animalID];

}

set
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.