Страница 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 < 5; i++)</b>
<b> Console .WriteLine ("Следующее число равно " + ob.GetNext() ) ;</b>
<b> Console.WriteLine("nСбросить") ;</b>
<b> ob.Reset();</b>
<b> for(int i=0; i < 5; i++)</b>
<b> Console.WriteLine("Следующее число равно " + ob.GetNext());</b>
<b> Console.WriteLine("nНачать с числа 100");</b>
<b> ob.SetStart(100);</b>
<b> for(int i=0; i < 5; i++)</b>
<b> Console.WriteLine("Следующее число равно " + ob.GetNext());</b>
<b> }</b>
<b>}</b>
Для того чтобы скомпилировать код класса SeriesDemo, необходимо включить в компиляцию файлы, содержащие интерфейс ISeries, а также классы ByTwos и SeriesDemo. Компилятор автоматически скомпилирует все три файла и сформирует из них окончательный исполняемый файл. Так, если эти файлы называются ISeries.cs, ByTwos.cs и SeriesDemo.cs, то программа будет скомпилирована в следующей командной строке:
<b>>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(), возвращающий предыдущее значение.