Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Public class Animals : DictionaryBase

Set

Get

Set

Get

Public class Animals: CollectionBase

{

public void Add(Animal newAnimal)

{

List,Add(newAnimal);

}

public void Remove(Animal newAnimal)

{

List.Remove(newAnimal);

}

public Animals()

{

}

public Animal thia[int animalIndex]

{

{

return (Animal)List[animalIndex];

}

{

List[animallndex] = value;

}

}

}

}

Модифицируйте код в Class1.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();

}

}

Код в 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. Наконец, появилась возможность задать какие-либо описатели для данного индексатора: мы можем определить данный индексатор либо как виртуальный, либо (в случае абстрактного класса) как абстрактный. Если индексатор объявлен как virtual, это означает, что переопределение данного индексатора допускается во всех классах, производных от индексируемого класса,— точно так же, как и переопределение виртуальных методов. Абстрактные индексаторы ничем не отличаются от виртуальных индексаторов, однако для их реализации не задается никакого кода — это обязанность возлагается на классы, являющиеся производными от индексируемого класса.

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

public Animal this(int animallndex)

{

{

return null;

}

{

}

}

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

 

Семейства с доступом по ключу

и интерфейс IDictionary

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

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

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

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

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

{

public void Add(string newID, Animal newAnimal)

{

Dictionary.Add(newID, newAnimal);

}

public void Remove(string animalID)

{

Dictionary.Remove(animalID);

}

public Animals()

{

}

public Animal this[string animalID]

{

<== предыдущая лекция | следующая лекция ==>
Namespace ChllExO2 | Namespace ChllCardLib
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 329; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.