Добавить в цитаты Настройки чтения

Страница 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>&lt;b&gt;  public int Length; //открытая переменная длины массива&lt;/b&gt;</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) &lt; 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) &lt; 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 &gt;= 0 &amp; index &lt; Length) return true; </b>

<b>    return false;</b>

<b>  }</b>

<b>}</b>

<b>// Продемонстрировать применение отказоустойчивого массива, </b>

<b>class FSDemo {</b>