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

С# - Ватсон К.

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


Например, класс семейства для хранения объектов Animal может быть в общих чертах определен следующим образом (вскоре мы познакомимся с более полным определением):

public class Animals : CollectionBase

public void Add(Animal new Animal)

t

List.Add(newAnimal);

)

public void Remove<Animal oldAnimal)

(

List.Remove(oldAnimal);

)

public Animals()

{ '

J

}

В данном случае Add() и RemoveO реализованы как строго типизированные методы, которые используют стандартный метод Add о интерфейса iLiet для осуществления доступа к элементам. Представленные методы будут работать только с классами Animal нлн с классами, производными от Animal, в отличие от встречавшихся нам ранее реализаций ArrayList, которые допускали использование произвольных объектов.

Класс CollectionBase позволяет использовать синтаксис Eoreach для производных семейств. Можно, например, написать следующий код:

Console.WriteLine<'Using custom collection class Animals:');

Animals anlmalCollection = пек Animals () ;

animalCollection.Add(пен Cow(*Sarah*>);

foreach (Animal myAnimal in animalCollection)

I

Console.WriteLine('New (0) object added to custom collection, ' +

'Name “ (1)', ny Animal. ToStringO , myAnimal .Name}; _

' -

А вот этот код является недопустимым:

animAlCollection[0] .FeedO;

Для того чтобы осуществлять доступ к элементам по их индексам таким способом, нам придется воспользоваться индексатором (indexer).
236 Глава 11

Индексаторы

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

Мы можем добавить ивдексатор в семейство Animals объектов Animal следующим образом:

public class Animals : CollectionBasc

(

public Animal this[int aniirallndex]

{

get

(

return (Animal)List[aniroallndex];

}

set -

{

List[anijnallndex] “ value)'

)

>

>

Ключевое слово this используется с параметрами, задаваемыми в квадратных скобках, однако во всем остальном оно выглядит почти точно так же, как и любое другое свойство. Такой синтаксис представляется весьма логичным, поскольку мы собираемся осуществлять доступ к индексатору, используя имя объекта, за которым следует один или несколько параметров, заключенных в квадратные скобки (например, HyAnimals [0] ).

Этот код использует индексатор для свойства List (т. е. для интерфейса iList, обеспечивающего доступ к семейству ArrayList класса collectionBase, в котором хранятся наши элементы):

return (Animal)List[animallndex];

Явное приведение типа является в данном случае совершенно необходимым, поскольку свойство iList.List возвращает объект класса System.object.

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

anim«lCollecticn[Q].Feed));

вместо:

((Animal)animalCollectiontO)),Feed();

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

237

Практикум: реализация семейства Animals

1. Создайте новое консольное приложение с именем ChiiEx02 В директории C:\BegCSharp\Chapterll,

2. Щелкните правой кнопкой мыши по имени проекта в окне Solution Explorer и выберите пункт Add | Add Existing Item... раскрывающегося меню (см. рис. справа).

ипташиаг."— jo очшан >J.> •?: /¦ ~ ' Кч>' . .
m й - . KBB ЩЯаиМгЬНл * j
'¦ - i - ^ ¦
№ ; Ny V ' rk :
ffco--* Г *з [ шв
[с/ Нм (*.o> .-j t.

m Add Мащ Item...
СШ ;s^ s>ei*r>Q J
*3 New Folder ^
Add Windows ?ог m...
m Add [phentedForm...
Ш Add User Control...
m Add Inherited Contrci,..
ii Add Component..,
% Add^lass...

3. Выберите файл Animal.са в директории

С: \BegCSharp\Chapterll\Cl)llEx01 и нажмите Open (см. рис, слева).

4. Измените объявление пространства имен О Animal.cs следующим образом;

. namespace ChllExQJ "

5. С помощью мастера Add Class добавьте новый класс с именем Animals н сохраните его в файле Animals.сз.

6. Измените код в Animals.cs следующим образом:

using System;

using System,Collections;

namespace ChllEx02

<

public class Animals t CollectionBase (

public void Add (Animal newAnimal)

Liet.Add(newAnimal);

public void Remove {Animal newAnimal)

List,Remove(newAnimal)i

public Animals ()

public Animal this [int animal Index]

(

get

(

return (Animal)List[animallndex];

>

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

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

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

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

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