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

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

Методы, реализующие интерфейс, должны быть объявлены как public. Дело в том, что в самом интерфейсе эти методы неявно подразумеваются как открытые, поэтому их реализация также должна быть открытой. Кроме того, возвращаемый тип и сигнатура реализуемого метода должны точно соответствовать возвращаемому типу и сигнатуре, указанным в определении интерфейса.

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

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

<b>class ByTwos : ISeries { </b>

<b>  int start; </b>

<b>  int val;</b>

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

<b>    start = 0; </b>

<b>    val = 0;</b>

<b>  }</b>

<b>  public int GetNext() { </b>

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

<b>    return val;</b>

<b>  }</b>

<b>  public void Reset()    {</b>

<b>    val = start;</b>

<b>  }</b>

<b>  public void SetStart(int x) { </b>

<b>    start = x; </b>

<b>    val = start;</b>

<b>  }</b>

<b>}</b>

Как видите, в классе ByTwos реализуются три метода, определяемых в интерфейсе ISeries. Как пояснялось выше, это приходится делать потому, что в классе нельзя реализовать интерфейс частично.

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

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

<b>//реализующего интерфейс, </b>

<b>using System;</b>

<b>class SeriesDemo {</b>

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

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

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

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

<b>    Console.WriteLine(&quot;nСбросить&quot;) ;</b>

<b>    ob.Reset();</b>

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

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

<b>    Console.WriteLine(&quot;nНачать с числа 100&quot;);</b>

<b>    ob.SetStart(100);</b>

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

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

<b>  }</b>

<b>}</b>

Для того чтобы скомпилировать код класса SeriesDemo, необходимо включить в компиляцию файлы, содержащие интерфейс ISeries, а также классы ByTwos и SeriesDemo. Компилятор автоматически скомпилирует все три файла и сформирует из них окончательный исполняемый файл. Так, если эти файлы называются ISeries.cs, ByTwos.cs и SeriesDemo.cs, то программа будет скомпилирована в следующей командной строке:

<b>&gt;csc SeriesDemo.cs ISeries.cs ByTwos.cs</b>

В интегрированной среде разработки Visual Studio для этой цели достаточно ввести все три упомянутых выше файла в конкретный проект С#. Кроме того, все три компилируемых элемента (интерфейс и оба класса) допускается включать в единый файл. Ниже приведен результат выполнения скомпилированного кода.

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

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

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

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

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

<b>Сбросить.</b>

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

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

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

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

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

<b>Начать с числа 100.</b>

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

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

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

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

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

В классах, реализующих интерфейсы, разрешается и часто практикуется определять их собственные дополнительные члены. В качестве примера ниже приведен другой вариант класса ByTwos, в который добавлен метод GetPrevious(), возвращающий предыдущее значение.