массива выполняется более изящным и надежным способом с помощью специально генерируемого исключения.

// Использовать специальное исключение для обработки // ошибок при-обращении к массиву класса RangeArray.

using System;

// Создать исключение для класса RangeArray. class RangeArrayException : Exception {

/* Реализовать все конструкторы класса Exception. Такие конструкторы просто реализуют конструктор базового класса. А поскольку класс исключения RangeArrayException ничего не добавляет к классу Exception, то никаких дополнительных действий не требуется. */ public RangeArrayException()    :    base()    {    }

public RangeArrayException(string str) : base(str) {    }

public RangeArrayException(

string str, Exception inner) : base(str, inner) { } protected RangeArrayException(

System.Runtime.Serialization.SerializationInfо si,

System.Runtime.Serialization.StreamingContext sc) : base(si, sc) { }

// Переопределить метод ToStringO для класса исключения RangeArrayException. public override string ToStringO { return Message;

}

}

// Улучшенный вариант класса RangeArray. class RangeArray {

// Закрытые данные.

int[] a; // ссылка на базовый массив int lowerBound; // наименьший индекс int upperBound; // наибольший индекс

// Автоматически реализуемое и доступное только для чтения свойство Length, public int Length { get; private set; }

// Построить массив по заданному размеру public RangeArray(int low, int high) { high++;

if(high <= low) {

throw new RangeArrayException("Нижний индекс не меньше верхнего.");

}

а = new int[high - low];

Length = high - low;

lowerBound = low; upperBound = —high;

}

// Это индексатор для класса RangeArray. public int this[int index] {

// Это аксессор get. get {

if(ok(index))    {

return a[index - lowerBound];

} else {

throw new RangeArrayException("Ошибка нарушения границ.");

}

}

// Это аксессор set. set {

if(ok(index))    {

a[index - lowerBound] = value;

}

else throw new RangeArrayException("Ошибка нарушения границ.");}

}

// Возвратить логическое значение true, если // индекс находится в установленных границах, private bool ok(int index) {

if(index >= lowerBound & index <= upperBound) return true; return false;

}

}

// Продемонстрировать применение массива с произвольно // задаваемыми пределами индексирования, class RangeArrayDemo { static void Main() { try {

RangeArray ra = new RangeArray(-5, 5);

RangeArray ra2 = new RangeArray(1, 10);

i

// Использовать объект га в качестве массива.

Console.WriteLine("Длина массива га: и- + га.Length); for(int i = -5; i <= 5; i++) ra[i] = i;

Перейти на страницу:

Похожие книги