Страница 195 из 502
<b> protected RangeArrayException(</b>
<b> System.Runtime.Serialization.SerializationInfo si,</b>
<b> System.Runtime.Serialization.StreamingContext sc) : base(si, sc) { }</b>
<b> // Переопределить метод ToString() </b>
<b> // для класса исключения RangeArrayException.</b>
<b> public override string ToString() {</b>
<b> return Message;</b>
<b> }</b>
<b>}</b>
<b>// Улучшенный вариант класса RangeArray. </b>
<b>class RangeArray {</b>
<b> // Закрытые данные.</b>
<b> int[] a; // ссылка на базовый массив</b>
<b> int lowerBound; // наименьший индекс</b>
<b> int upperBound; // наибольший индекс</b>
<b> // Автоматически реализуемое и доступное</b>
<b> // только для чтения свойство Length,</b>
<b> public int Length { get; private set; }</b>
<b> // Построить массив по заданному размеру</b>
<b> public RangeArray(int low, int high) {</b>
<b> high++;</b>
<b> if(high <= low) {</b>
<b> throw new RangeArrayException("Нижний индекс не меньше верхнего.");</b>
<b> }</b>
<b> a = new int[high - low];</b>
<b> Length = high - low;</b>
<b> lowerBound = low;</b>
<b> upperBound = --high;</b>
<b> }</b>
<b> // Это индексатор для класса RangeArray.</b>
<b> public int this[int index] {</b>
<b> // Это аксессор get. </b>
<b> get {</b>
<b> if(ok(index)) {</b>
<b> return a[index - lowerBound];</b>
<b> } else {</b>
<b> throw new RangeArrayException("Ошибка нарушения границ.");</b>
<b> }</b>
<b> }</b>
<b> // Это аксессор set.</b>
<b> set {</b>
<b> if(ok(index)) {</b>
<b> a[index - lowerBound] = value;</b>
<b> }</b>
<b> else throw new RangeArrayException("Ошибка нарушения границ.");</b>
<b> }</b>
<b> }</b>
<b> // Возвратить логическое значение true, если </b>
<b> // индекс находится в установленных границах,</b>
<b> private bool ok(int index) {</b>
<b> if(index >= lowerBound & index <= upperBound) return true;</b>
<b> return false;</b>
<b> }</b>
<b>}</b>
<b>// Продемонстрировать применение массива с произвольно</b>
<b>// задаваемыми пределами индексирования,</b>
<b>class RangeArrayDemo {</b>
<b> static void Main() {</b>
<b> try {</b>
<b> RangeArray ra = new RangeArray(-5, 5);</b>
<b> RangeArray ra2 = new RangeArray(1, 10);</b>
<b> // Использовать объект га в качестве массива.</b>
<b> Console.WriteLine("Длина массива rа: <sup>"</sup> + ra.Length);</b>
<b> for(int i = -5; i <= 5; i++) ra[i] = i;</b>
<b> Console.Write("Содержимое массива ra: ");</b>
<b> for (int i = -5; i <= 5; i++)</b>
<b> Console.Write(ra[i] + " ");</b>
<b> Console.WriteLine("n");</b>
<b> // Использовать объект ra2 в качестве массива.</b>
<b> Console.WriteLine("Длина массива rа2: " + ra2.Length);</b>
<b> for (int i = 1; i <= 10; i++) ra2[i] = i;</b>
<b> Console.Write("Длина массива ra2: ");</b>
<b> for (int i = 1; i <= 10; i++)</b>
<b> Console.Write(ra2[i] + " ");</b>
<b> Console.WriteLine("n") ;</b>