- •Вопрос 2) Понятие класса и объекта
- •Вопрос 3) Структура класса и синтаксис декларации класса
- •Вопрос 4) Доступ к членам класса. Закрытые и открытые члены класса.
- •Вопрос 5) Принцип инкапсуляции
- •Вопрос 6) Методы. Способы передачи параметров
- •Вопрос 7) Реализация методов класса. Конструкторы и деструкторы. Методы и их параметры
- •Конструкторы и деструкторы
- •Вопрос 8) Полиформизм, перегрузка методов
- •Виртуальные методы
- •Абстрактные классы
- •Вопрос 10) Интерфейсы c#
- •Вопрос 11) Классы и структуры Класс
- •Вопрос 12) Создание нового экземпляра класса.
- •13. Преобразование методов базового класса. Вызов методов базового класса.
- •Вопрос 14) Свойства и методы в ооп
- •Вопрос 15) События и методы в ооп События
- •Вопрос 16) Индексаторы с#
- •Вопрос 17) Делегаты в классах с#
- •Вопрос 18) Обобщенные классы или шаблоны.
Вопрос 16) Индексаторы с#
Индексаторы
Создание индексаторов
Индексатор позволяет работать с классом или структурой таким образом, как если бы это были массивы. Индексация класса выполняется по индексу, указываемому как параметр. Иногда классы, используемые как индексаторы, называют классами-индексаторами.
Объявление индексатора может иметь следующее формальное описание:
[атрибуты] [модификаторы] тип this [[атрибуты]
тип_параметра идентификатор_параметра .,...]
Индексатор должен иметь как минимум один параметр. Тип и идентификатор параметра указываются в квадратных скобках после ключевого слова this. Среда проектирования Visual Studio.NET позволяет использовать мастер создания индексатора: для этого в окне Class View следует выделить имя класса и выполнить команду контекстного меню Add|Add Indexer.
Диалог C# Indexer Wizard (рис. 17.1) позволяет определить параметры создаваемого индексатора.
Рис. 17.1. Диалог C# Indexer Wizard
В поле Indexer Аcess указывается модификатор доступа для индексатора. Это могут быть следующие модификаторы:
public - доступ не ограничен;
protected - доступ ограничен только наследуемыми классами;
internal - доступ ограничен рамками текущего проекта;
private - доступ ограничен рамками данного класса;
protected internal - ограничение доступа наследуемыми классами текущего проекта.
В поле Indexer Type определяется тип массива, используемого для индексатора. В качестве типа индексатора может быть выбран любой из следующих типов:
bool - логическое значение true или false;
decimal - 128-битовый тип данных (1,0 * 10-28 до 7,9 * 1028);
int - 32-битовое целочисленное значение;
sbyte - знаковое 8-битовое целое (от - 128 до 127);
uint - беззнаковое 32-битовое целочисленное значение (от 0 до 4 294 967 295);
byte;
double - 64-битовый тип данных (±5,0 * 10-324 до ±1,7 * 10308);
long - 64-битовое целочисленное значение;
string;
ulong;
char;
float- 32-битовый тип данных (±1.5 * 10-45 до ±3.4 * 1038);
object;
short;
ushort.
Поле Parameter Name содержит имя параметра.
На панели Indexer Modifiers можно выбрать одну из следующих опций:
None - индексатор не содержит дополнительных модификаторов;
Virtual - реализация индексатора может быть переопределена в наследуемых классах, для индексатора указывается ключевое слово virtual;
Abstract - индексатор является членом абстрактного класса, для индексатора указывается ключевое слово abstract.
Ключевое слово this используется как имя индексатора, так как с классом, содержащим индексатор, можно манипулировать как с массивом.
Например:
public int this[int ind1] // Индексатор типа int
// с одним параметром типа int - ind1
{ get { return 0; }
set { }
}
Методы-аксессоры
После определения параметра в фигурных скобках указаны два метода-аксессора. get-аксессор возвращает значение данных по указанному индексу,а set-аксессор устанавливает значение данных с указанным индексом. Устанавливаемое значение задается ключевым словом value.
Индексатор устанавливает и возвращает значения некоторого массива. Такой массив для аксессора должен быть создан. Типы используемого массива и аксессора должны совпадать. Например для целочисленного аксессора можно объявить следующий массив:
private int [] imyArray = new int[50];
Теперь, чтобы использовать акссессор, следует:
определить возвращаемое методом-аксессором значение (например: return imyArray[ind1];);
определить устанавливаемое методом-аксессором значение (например: imyArray[ind1]= value;).
В результате класс, содержащий аксессор, будет иметь следующее объявление:
public class AClass1
{
public AClass1() { }
private int [] imyArray = new int[20];
public int this[int ind1]
{
get
{ return imyArray[ind1]; }
set
{ imyArray[ind1]= value; }
}
}
Элементы индексатора
Объект класса, используемого как аксессор, создается обычным образом. Инициализация элементов аксессора указывается как присвоение значений элементам массива. Доступ к элементам аксессора записывается как доступ к элементам массива.
Например:
AClass1 ac1= new AClass1();
ac1[0]=5;
ac1[1]=6;
Console.WriteLine("ac1[0]= {0}, ac1[1]= {1}",
ac1[0],ac1[1]);
Индексаторы на базе многомерных массивов
Для одного класса может быть создано несколько индексаторов. Индексаторы должны различаться числом параметров.
Например:
public class AClass1
{ public AClass1() { }
private int [] imyArray = new int[20];
public int this[int ind1]
{ get { return imyArray[ind1]; }
set { imyArray[ind1]= value; }
}
private int [,] imyArray2 = new int[2,10];
public int this[int ind1, int ind2]
{ get {return imyArray2[ind1,ind2]; }
set {imyArray2[ind1,ind2]= value; }
}
}