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

Страница 175 из 502

<b>    ISeries ob;</b>

<b>    for(int i=0; i &lt; 5; i++) {</b>

<b>      ob = twoOb;</b>

<b>      Console.WriteLine(&quot;Следующее четное число равно &quot; </b>

<b>             + ob.GetNext());</b>

<b>      ob = primeOb;</b>

<b>      Console.WriteLine(&quot;Следующее простое число &quot; </b>

<b>             + &quot;равно &quot; + ob.GetNext());</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Вот к какому результату приводит выполнение этой программы:

<b>Следующее четное число равно 2 </b>

<b>Следующее простое число равно 3 </b>

<b>Следующее четное число равно 4 </b>

<b>Следующее простое число равно 5 </b>

<b>Следующее четное число равно 6 </b>

<b>Следующее простое число равно 7 </b>

<b>Следующее четное число равно 8 </b>

<b>Следующее простое число равно 11 </b>

<b>Следующее четное число равно 10 </b>

<b>Следующее простое число равно 13</b>

В методе Main() переменная ob объявляется для ссылки на интерфейс ISeries. Это означает, что в ней могут храниться ссылки на объект любого класса, реализующего интерфейс ISeries. В данном случае она служит для ссылки на объекты twoOb и primeOb классов ByTwos иPrimes  соответственно, в которых реализован интерфейс ISeries.

И еще одно замечание: переменной ссылки на интерфейс доступны только методы, объявленные в ее интерфейсе. Поэтому интерфейсную ссылку нельзя использовать для доступа к любым другим переменным и методам, которые не поддерживаются объектом класса, реализующего данный интерфейс.

Интерфейсные свойства

Аналогично методам, свойства указываются в интерфейсе вообще без тела. Ниже приведена общая форма объявления интерфейсного свойства.

<b>// Интерфейсное свойство </b>

<b>тип имя{ get; set; }</b>

Очевидно, что в определении интерфейсных свойств, доступных только для чтения или только для записи, должен присутствовать единственный аксессор: get или set соответственно.

Несмотря на то что объявление свойства в интерфейсе очень похоже на объявление автоматически реализуемого свойства в классе, между ними все же имеется отличие. При объявлении в интерфейсе свойство не становится автоматически реализуемым. В этом случае указывается только имя и тип свойства, а его реализация предоставляется каждому реализующему классу. Кроме того, при объявлении свойства в интерфейсе не разрешается указывать модификаторы доступа для аксессоров. Например, аксессор set не может быть указан в интерфейсе как private.

Ниже в качестве примера приведен переделанный вариант интерфейса ISeries и класса ByTwos, в котором свойство Next используется для получения и установки следующего по порядку числа, которое больше предыдущего на два.

<b>// Продемонстрировать интерфейсные ссылки</b>

<b>using System;</b> 

<b>public interface ISeries {</b>

<b>// Интерфейсное свойство, </b>

<b>  int Next {</b>

<b>    get; // возвратить следующее по порядку число </b>

<b>    set; // установить следующее число</b>

<b>  }</b>

<b>}</b>

<b>// Реализовать интерфейс ISeries, </b>

<b>class ByTwos : ISeries { int val;</b>

<b>  public ByTwos() {</b>

<b>    val = 0;</b>

<b>  }</b>

<b>  // Получить или установить значение, </b>

<b>  public int Next { </b>

<b>    get {</b>

<b>      val += 2;</b>

<b>      return val;</b>

<b>    }</b>

<b>    set {</b>

<b>      val = value;</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

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

<b>class SeriesDemo3 {</b>

<b>  static void Main() {</b>

<b>    ByTwos ob = new ByTwos();</b>

<b>    // Получить доступ к последовательному ряду </b>

<b>    //чисел с помощью свойства,</b>

<b>    for(int i=0; i &lt; 5; i++)</b>

<b>      Console.WriteLine(&quot;Следующее число равно &quot; + ob.Next);</b>