Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 6. Интерфейсы и структурные типы

В объектно-ориентированном программировании иногда требуется определить, что класс должен делать, а не как он будет это делать. Вы уже видели такой подход на примере абстрактного метода. Абстрактный метод определяет сигнатуру для метода, но не обеспечивает его реализации. В производном классе каждый абстрактный метод, определенный базовым классом, реализуется по-своему. Таким образом, абстрактный метод задает интерфейс для метода, но не способ его реализации. В С# предусмотрена возможность полностью отделить интерфейс класса от его реализации с помощью ключевого слова interface.

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

Для реализации интерфейса класс должен обеспечить тела методов, описанных в интерфейсе. Каждый класс может определить собственную реализацию. Таким образом, два класса могут реализовать один и тот же интерфейс различными способами, но все классы поддерживают одинаковый набор методов. Следовательно, код, "осведомленный" о наличии интерфейса, может использовать объекты любого класса, поскольку интерфейс для всех объектов одинаков. Предоставляя программистам возможность применения такого средства программирования, как интерфейс, С# позволяет в полной мере использовать аспект полиморфизма, выражаемый как "один интерфейс — много методов".

Интерфейсы объявляются с помощью ключевого слова interface.

 

interface имя{

тип_возврата имя_метода1 {список_параметров);

тип_возврата имя_метода2 {список_параметров);

//...

тип_возврата имя_методаN(список_параметров);

}

Имя интерфейса задается элементом имя. Методы объявляются с использованием лишь типа возвращаемого ими значения и сигнатуры. Все эти методы, по сути, — абстрактные. Для методов в интерфейсе не предусмотрены способы реализации. Следовательно, каждый класс, который включает интерфейс, должен реализовать все его методы. В интерфейсе методы неявно являются открытыми (public - методами), при этом не разрешается явным образом указывать спецификатор доступа.

Пример интерфейса для класса, который генерирует ряд чисел.

publicinterfaceISeries {

intgetNext(); // Возвращает следующее число ряда,

voidreset (); // Выполняет перезапуск,

voidsetStart(intx); // Устанавливает начальное

// значение.

}

Этот интерфейс имеет имя ISeries. Хотя префикс "I" необязателен, многие программисты его используют, чтобы отличать интерфейсы от классов. Интерфейс ISeries объявлен открытым, поэтому он может быть реализован любым классом в любой программе.

 

6.1 Реализация интерфейсов

Если интерфейс определен, один или несколько классов могут его реализовать. Чтобы реализовать интерфейс, нужно указать его имя после имени класса подобно тому, как при создании производного указывается базовый класс. Формат записи класса, который реализует интерфейс, таков:

class имя_класса: имя__интерфейса {

// тело класса

}

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

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

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

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

// Реализация интерфейса ISeries,

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 реализует все три метода, определенные интерфейсом ISeries. Классу не разрешается создавать частичную реализацию интерфейса.

Рассмотрим пример, демонстрирующий использование класса ByTwos. Вот его код:

// Демонстрация использования интерфейса,

// реализованного классом ByTwos.

usingSystem;

class SeriesDemo {

public static void Main() {

ByTwos ob = new ByTwos();

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("ХпНачинаем с числа 100.");

ob.setStart (100);

for(int i= 0; i < 5; i++)

Console.WriteLine("Следующее значение равно " +"

ob.getNext());

}}

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

csc SeriesDemo.cs ISeries.cs ByTwos.cs

В классах, которые реализуют интерфейсы, можно определять дополнительные члены.

 

6.2 Использование интерфейсных ссылок

В C# можно объявить ссылочнуюпеременную интерфейсного типа. Другими словами, можно создать переменнуюссылку на интерфейс. Такая переменная может ссылаться на любой объект, которыйреализует ее интерфейс. При вызове метода для объекта посредством интерфейснойссылки будет выполнена та версия указанного метода, которая реализована этим объектом.

 

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

Как и методы, свойства определяются в интерфейсе без тела. Ниже приведен формат спецификации свойства.

// Интерфейсное свойство

тип имя{

get;

set;

}

Свойства, предназначенные только для чтения или только для записи, содержат только get - или set -элемент, соответственно.

 

<== предыдущая лекция | следующая лекция ==>
Попытка присвоить -10 свойству ob.myprop | Интерфейсные индексаторы
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 898; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.022 сек.