Страница 136 из 502
Индексатор может быть перегружен. В этом случае для выполнения выбирается тот вариант индексатора, в котором точнее соблюдается соответствие его параметра и аргумента, указываемого в качестве индекса. Ниже приведен пример программы, в которой индексатор массива класса FailSoftArray перегружается для индексов типа double. При этом индексатор типа double округляет свой индекс до ближайшего целого значения.
<b>// Перегрузить индексатор массива класса FailSoftArray.</b>
<b>using System;</b>
<b>class FailSoftArray {</b>
<b> int[] a; // ссылка на базовый массив</b>
<div class="fb2-code"><code><b> public int Length; //открытая переменная длины массива</b></code></div>
<b> public bool ErrFlag; // обозначает результат последней операции</b>
<b> // Построить массив заданного размера, </b>
<b> public FailSoftArray(int size) { </b>
<b> a = new int[size];</b>
<b> Length = size;</b>
<b> }</b>
<b> // Это индексатор типа int для массива FailSoftArray. </b>
<b> public int this[int index] {</b>
<b> // Это аксессор get. </b>
<b> get {</b>
<b> if(ok(index)) {</b>
<b> ErrFlag = false; </b>
<b> return a[index];</b>
<b> } </b>
<b> else </b>
<b> {</b>
<b> ErrFlag = true; </b>
<b> return 0;</b>
<b> }</b>
<b> }</b>
<b> // Это аксессор set. </b>
<b> set {</b>
<b> if(ok(index)) {</b>
<b> a[index] = value;</b>
<b> ErrFlag = false;</b>
<b> }</b>
<b> else </b>
<b> ErrFlag = true;</b>
<b> }</b>
<b> }</b>
<b> /* Это еще один индексатор для массива FailSoftArray. </b><b>Он округляет свой аргумент до ближайшего целого индекса. */ </b>
<b> public int this[double idx] {</b>
<b> // Это аксессор get. </b>
<b> get {</b>
<b> int index;</b>
<b> // Округлить до ближайшего целого.</b>
<b> if((idx - (int) idx) < 0.5) index = (int) idx;</b>
<b> else index = (int) idx + 1;</b>
<b> if(ok(index)) {</b>
<b> ErrFlag = false; </b>
<b> return a[index];</b>
<b> } </b>
<b> else </b>
<b> {</b>
<b> ErrFlag = true; </b>
<b> return 0;</b>
<b> }</b>
<b> }</b>
<b> // Это аксессор set. </b>
<b> set {</b>
<b> int index;</b>
<b> // Округлить до ближайшего целого.</b>
<b> if( (idx - (int) idx) < 0.5) index = (int) idx;</b>
<b> else index = (int) idx + 1;</b>
<b> if (ok (index) ) {</b>
<b> a[index] = value;</b>
<b> ErrFlag = false;</b>
<b> }</b>
<b> else </b>
<b> ErrFlag = true;</b>
<b> }</b>
<b> }</b>
<b> // Возвратить логическое значение true, если </b>
<b> // индекс находится в установленных границах, </b>
<b> private bool ok(int index) {</b>
<b> if(index >= 0 & index < Length) return true; </b>
<b> return false;</b>
<b> }</b>
<b>}</b>
<b>// Продемонстрировать применение отказоустойчивого массива, </b>
<b>class FSDemo {</b>