Class имя_класса : имя_интерфейса
{
// тело класса
}
Если класс реализует интерфейс, он должен это сделать в полном объеме, т.е. реализация интерфейса не может быть выполнена частично.
Классы могут реализовать несколько интерфейсов. В этом случае имена интерфейсов отделяются запятыми.
Класс может наследовать базовый класс и реализовать один или несколько интерфейсов. В этом случае список интерфейсов должен возглавлять имя базового класса.
Рассмотрим пример реализации интерфейса ISeries, объявление которого было приведено выше. Здесь создается класс с именем ByTwos, генерирующий ряд чисел, в котором каждое следующее число больше предыдущего на два.
Class ByTwos : ISeries
{
int start;
int val;
Public ByTwos()
{
start = 0;
val = 0;
}
Public int getNext()
{
val += 2;
return val;
}
Public void reset()
{
val = start;
}
Public void setStart(int x)
{
start = x;
val = start;
}
// Здесь могут быть дополнительные члены
}
Рассмотрим пример, демонстрирующий использование интерфейса, реализованного классом ByTwos.
using System;
Class SeriesDemo
{
Public static void Main()
{
ByTwos ob = new ByTwos();
If (ob is ISeries)
Console.WriteLine("Объект реализует интерфейс ISeries");
else throw new Exception ("Объект НЕ реализует ISeries");
for (int i = 0; i < 5; i++)
Console.WriteLine("Следующее значение = " + ob.getNext());
Console.WriteLine("\nПереход в исходное состояние.");
ob.reset();
for (int i = 0; i < 5; i++)
Console.WriteLine("Следующее значение = " + ob.getNext());
Console.WriteLine("\nНачинаем с числа 100.");
ob.setStart(100);
for (int i = 0; i < 5; i++)
Console.WriteLine("Следующее значение = " + ob.getNext());
}
}
}
Рассмотрим пример другой реализации интерфейса. Класс Primes генерирует ряд простых чисел. Обратите внимание на то, что его способ реализации интерфейса ISeries в корне отличается от используемого классом ByTwos.
Class Primes : ISeries
{
int start;
int val;
Public Primes()
{
start = 2;
val = 2;
}
Public int getNext()
{
int i, j;
bool isprime;
val++;
for (i = val; i < 1000000; i++)
{
isprime = true;
for (j = 2; j < (i / j + 1); j++)
{
if ((i % j) == 0)
{
isprime = false;
break;
}
}
If (isprime)
{
val = i;
break;
}
}
return val;
}
Public void reset()
{
val = start;
}
Public void setStart(int x)
{
start = x;
val = start;
}
}
Здесь важно понимать, что, хотя классы Primes и ByTwos генерируют разные ряды чисел, оба они реализуют один и тот же интерфейс ISeries.
Использование интерфейсных ссылок
Ссылочная переменная интерфейсного типа может ссылаться на любой объект, который реализует ее интерфейс.
В этом случае интерфейс выступает в роли базового класса, а его наследники являются производными классами. Поэтому в случае наследования интерфейса работает тот же механизм, что и для классов.
Важно понимать, что интерфейсная ссылочная переменная "осведомлена" только о методах, объявленных "под сенью" ключевого слова interface. Следовательно, интерфейсную ссылочную переменную нельзя использовать для доступа к другим переменным или методам, которые может определить объект, реализующий этот интерфейс.
Дата добавления: 2019-02-08; просмотров: 782;