Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Интересное:
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Дисциплины:
2018-01-29 | 353 |
5.00
из
|
Заказать работу |
|
|
Определение одномерного индексатора
В некоторых ситуациях бывает удобно индексировать (нумеровать) содержимое объекта так, словно он представляет собой массив. Особенно если поля класса представляют собой массив, стек или какие-то перечисления. Такая задача решается разработкой индексатора.
Индексация массивов реализуется с помощью оператора массива, который обозначается [ ]. С его помощью, можно получить доступ к отдельному элементу массива (mas[2],..., mas[i]).
C# позволяет строить пользовательские классы и структуры, которые могут индексироваться как массивы. Тогда к i-ому элементу значения объекта можно подступиться как Ob[i].
Свойства и индексаторы расширяют возможности класса. Свойства предлагают эффективный способ управления доступом к данным объекта. Индексаторы обеспечивают механизм, посредством которого к объектам можно получать доступ по индексам на основе синтаксиса массивов. То есть индексируемый объект выглядит как массив, но для выполнения индексации в нём определяют специальные функции доступа.
Итак, индексатор позволяет обеспечить индексируемый доступ к объекту. Его главное назначение – создавать специализированные (ранжированные) массивы, на которые налагается одно или несколько ограничений. Индексаторы позволяют использовать синтаксис работы с массивами для доступа к классу, который содержит: массив, какие-то перечисления (enum), а так же наборы (коллекции или семейства). При использовании индексаторов пользовательские коллекции работают с базовыми библиотеками.NET.
Индексатор в C# представляет собой несколько «искажённое» свойство. Индексаторы могут характеризоваться одной или несколькими размерностями.
|
Создание одномерных индексаторов. Формат записи одномерного индексатора:
public Тип_элемента_объекта this [int индекс] // this - этот
{
Get //Аксессор считывания данных
{
//Возврат значения, заданного индексом.
}
Set //Аксессор установки данных.
{
//Установка значения элементу, заданному индексом
}
}
Объявление индексатора похоже на объявление свойства, но в нём используются указатель this и индекс. Оба аксессора в качестве параметра принимают индекс. Например:
Ob[5] = 13.87; // [5] - это и есть индексатор. Здесь работал set- аксессор.
double z = Ob[2] + 100; // Здесь работал get-аксессор.
Класс «Безопасный массив»
Задание: В проекте «Первые_учебные_классы» создать класс Bezopasn_mas (Безопасный массив) с использование одномерного индексатора. Под безопасностью понимается проверка выхода индекса за пределы границ массива.
class Bezopasn_mas
{
double [] mas; //
Int dlina; // Закрытые поля класса
bool errflag; //
// Конструктор:
public Bezopasn_mas(int size)
{
dlina = size;
mas = new double[size]; // Позднее связывание ссылочной переменной с памятью.
}
// Свойства:
Public int Razmer
{
get { return dlina; }
}
Public bool Oshibka
{
get { return errflag; }
}
}
Для разработки индексатора создадим закрытый вспомогательный метод OK(int index), который возвращает true, если индекс находится в пределах границ массива, а иначе возвращает false.
Private bool OK(int index)
{
if (index >= 0 && index < Razmer)
return true;
Else
return false;
}
// Индексатор:
public double this [int index]
{
Get
{
If (OK(index))
{
errflag = false; // Ошибки нет!
return mas[index];
}
Else
{
errflag = true; //Ошибка индекса!
Return 0; // С целью безопасности программа должна работать далее. Мы возвращаем ноль.
}
}
Set
{
If (OK(index))
{
errflag = false; //Ошибки нет!
mas[index] = value;
}
Else
errflag = true;
}
}
//В Main():
Bezopasn_mas Ob1 = new Bezopasn_mas(5);
int i=0; double x=0;
Console.WriteLine("Мягкое приземление! Работа с массивом без уведомлений об ошибках");
Заполняя массив, нарушим его границы:
for (i = 0; i < Ob1.Razmer * 2; i++)
{
Console.WriteLine("Введите " + i + " элемент массива!");
|
Ob1[i] = Double.Parse(Console.ReadLine());
}
Console.WriteLine("Содержимое массива");
for (i = 0; i < Ob1.Razmer * 2; i++)
{
x = Ob1[i];
Console.Write(x+ " ");
}
Console.WriteLine();
//Выполнить!
Console.WriteLine("Работа с объектом-массивом с выдачей сообщений об ошибке!");
for (i = 0; i < Ob1.Razmer * 2; i++)
{
Console.WriteLine("Введите " + i + " элемент массива!");
Ob1[i] = Double.Parse(Console.ReadLine());
if (Ob1.Oshibka)
Console.WriteLine("Элемент с номером " + i + " вне границ!");
}
Console.WriteLine("Содержимое массива");
for (i = 0; i < Ob1.Razmer * 2; i++)
{
x = Ob1[i];
if (Ob1.Oshibka)
Console.WriteLine("Элемент с номером " + i + " вне границ!");
Console.Write(x+ " ");
}
Console.WriteLine();
Виртуальный массив
Индексатор может не использовать базовый массив, объявленный в классе. Вполне достаточно, чтобы индексатор обеспечивал функционирование, которое для пользователя выглядело бы так, как будто идёт работа с массивом (виртуальный массив).
Задание: В проект «Первые_учебные_классы» добавить новый класс: Stepeni_2. В этом классе создать индексатор, который действует подобно массиву, предназначенному только для чтения. Такой виртуальный массив будет содержать степени числа 2 от 0 до 15. В действительности же никакого массива НЕТ. Роль индекса будет играть показатель степени.
Существует много алгоритмов, в которых вычисляется какой-то i-й элемент: числа Фибоначчи, целая степень числа, очередной член ряда Тейлора и другие.
//Разработка класса Stepeni_2:
//Вспомогательный закрытый метод Stepen(int pokaz):
|
|
Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!