Страница 175 из 502
<b> ISeries ob;</b>
<b> for(int i=0; i < 5; i++) {</b>
<b> ob = twoOb;</b>
<b> Console.WriteLine("Следующее четное число равно " </b>
<b> + ob.GetNext());</b>
<b> ob = primeOb;</b>
<b> Console.WriteLine("Следующее простое число " </b>
<b> + "равно " + 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 < 5; i++)</b>
<b> Console.WriteLine("Следующее число равно " + ob.Next);</b>