Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

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

Прежде чем рассмотреть реализацию интерфейса "реализация интерфейса" ,

уточним отличия интерфейсов от абстрактных классов. Наиболее важное отличие

состоит в том, что при наследовании классов у каждого класса может быть только

один базовый класс – множественное наследование классов "класс:множественное

наследование классов" в языке C# невозможно. При построении класса на основ

е

интерфейсов их может быть любое количество. Другими словами класс может

реализовать сколько угодно интерфейсов, но при этом может иметь только один

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

конструкторов. В интерфейсе нельзя объявлять статические методы.

Как и для абстрактных классов невозможно определить объект с помощью

интерфейса.

Чтобы интерфейсом можно было пользоваться, он должен быть реализован

классом или структурой. В этой главе рассмотрим реализацию интерфейсов с

помощью классов. Синтаксически отношение реализации интерфейса обозначается

включением имени интерфейса в спецификацию базы класса. Напомним формат

объявления

класса

со

спецификацией

базы

(для

простоты

не

указаны

модификаторы класса):

class имя_класса спецификация_базы

{

объявления_членов_класса

}

Спецификация базы класса "класс:спецификация базы класса" в этом случае

имеет вид:

:имя_базового_классаopt, список_интерфейсовopt

Имя базового класса (и следующая за ним запятая) могут отсутствовать. В

списке интерфейсов через запятые помещаются имена тех интерфейсов, которые

должен реализовать класс. В спецификацию базы класса может входить только

один базовый класс и произвольное число имён интерфейсов. При этом должно

выполняться обязательное условие – класс должен реализовать все члены всех

интерфейсов, включённых в спецификацию базы. Частный случай – класс,

реализующий только один интерфейс:

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

{

объявления_членов_класса

}

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

полное определение в реализующем классе, снабженное модификатором доступа

public.

Сигнатуры и типы возвращаемых значений методов, свойств и индексаторов в

реализациях и в интерфейсе должны полностью совпадать.

Покажем на примерах, как при построении класса на основе интерфейса класс

реализует его методы, свойства и индексаторы. Реализацию событий нужно

рассмотреть позднее в главе, посвящённой событиям.

В следующей программе (14_01.cs) интерфейс IPublication, реализуется

классом Item – "заметка в газете".

// 14_01.cs - Интерфейс и его реализация

using System;

Interface iPublication { // интерфейс публикаций

Void write(); // готовить публикацию

Void read(); // читать публикацию

string Title { set; get; } // название публикации

}

class Item : IPublication { // заметка в газете

string newspaper = "Известия"; // название газеты

string headline; // заголовок статьи

public string Title { // реализация свойства

set { headline = value; }

get { return headline; }

}

public void write() { // реализация метода

/* операторы, имитирующие подготовку статьи */

}

public void read() { // реализация метода

/*операторы, имитирующие чтение статьи */

Console.WriteLine(@"Прочёл в газете ""{0}""статью ""{1}"".",

newspaper, Title);

}

}

class Program

{

static void Main() {

Console.WriteLine("Publication!");

Item article = new Item();

article.Title = "О кооперации";

article.read();

}

}

Результат выполнения программы:

Publication!

Прочёл в газете "Известия"статью "О кооперации".

Класс Item кроме реализаций членов интерфейса включает объявления

закрытых полей: newspaper (название газеты) и headline (заголовок статьи). Для

простоты в класс не включён конструктор и только условно обозначены операторы

методов write() и read(). Реализация свойства Title приведена полностью – аксессоры

get и set позволяют получить и задать название статьи, представляемой конкретным

объектом класса Item. В методе Main() нет ничего незнакомого читателю –

определён объект класса Item и ссылка articte на него. С помощью обращения

arcticle.Title задано название статьи.

В UML для изображения интерфейсов применяется та же символика, что и для

классов (см. рис. 14.1). Конечно, имеется отличие – в верхней части, после имени

интерфейса помещается служебное слово Interface. Тот факт, что класс реализует

интерфейс, отображается с помощью специального символа и имени интерфейса

над прямоугольником, представляющим класс.

Рис 14.1. Диаграмма классов с интерфейсом для программы 14_01.cs

В качестве второго примера рассмотрим интерфейс, реализация членов

которого позволит получать целочисленные значения членов числовых рядов

(Шилдт [14]):

Соседние файлы в папке CSBasicCourse2ndedPodbelsky