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

14.5. Интерфейсы и наследование

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

помощью классов. Отмечали (но не иллюстрировали) возможность реализации

одним классом нескольких интерфейсов. Интерфейсы C# могут наследоваться

независимо

от

классов

.

Однако

,

наследование

интерфейсов

"интерфейс:наследование интерфейсов"

отличается от наследования классов

.

Рассмотрим, что такое наследование интерфейсов и в чем его отличия от

наследования классов.

Напомним, что в объявление интерфейса может входить спецификация базы

интерфейса "интерфейс:спецификаия базы интерфейса" , формат которой можно

представить так:

:список_базовых_интерфейсовopt

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

наследником других интерфейсов. Тем самым формируются цепочки или иерархии

наследования интерфейсов. Естественное ограничение – среди базовых интерфейсов

не может присутствовать определяемый интерфейс.

При

реализации

интерфейса,

который

является

наследником

других

интерфейсов, класс должен реализовать все члены всех интерфейсов, входящих в

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

"иерархии

интерфейсов" объединяются в единый набор членов, каждый из которых должен

быть реализован конкретным классом (или конкретной структурой). Для

иллюстрации приведём следующую программу:

// 14_06.cs - наследование интерфейсов

using System;

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

{

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

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

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

}

interface IBook : IPublication // интерфейс книг

{

string Author { set; get; } // автор

int Pages { set; get; } // количество страниц

string Publisher { get; } // издательство

int Year { get; set; } // год опубликования

}

class Book : IBook

{

string title; // название книги

string author; // автор

int pages; // количество страни

ц

string publisher; // издательство

int year; // год опубликования

public string Title { set { title = value; }

get { return title; } }

public string Author { set { author = value; }

get { return author; } }

public int Pages { set { pages = value; }

get { return pages; } }

public string Publisher { set { publisher = value; }

get { return publisher; } }

public int Year { set { year = value; }

get { return year; } }

public void write() { /* операторы метода */ }

public void read() { /* операторы метода */}

}

class Program

{

public static void Main()

{

Book booklet = new Book();

booklet.Author = "Л.Н. Волгин";

booklet.Title = @"""Принцип согласованного оптимума""";

Console.WriteLine("Автор: {0}, Название: {1}.",

booklet.Author, booklet.Title);

}

}

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

Автор: Л.Н. Волгин, Название: "Принцип согласованного оптимума".

Здесь интерфейс IBook построен на основе интерфейса IPublication. Класс

Book реализует интерфейс IBook и в нём реализованы члены обоих интерфейсов.

Чтобы

не

усложнять

пример

реализации

методов

IPublication.write()

и

IPublication.read() приведены не полностью. Но удалить эти методы из класса Book

нельзя – класс должен реализовывать все члены всех интерфейсов, но основе

которых он построен. В методе Main() выполняются простейшие действия с

объектом класса Book.

Рис 14.3. Наследование интерфейсов в программе 14_06.cs

Для изображения наследования интерфейсов

"наследование:" интерфейсо

в

UML использует та же нотация, что и для наследования классов. Производный

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

изображение базового интерфейса. На рис. 14.3 показано отношение интерфейсов

IPublication и IBook, а также специальным символом над классом Book изображён

тот факт, что класс Book релизует интерфейс IBook.

При наследовании интерфейсов разрешено множественное наследование

"наследование:" множественное , причём при этом возможно и построение

ромбовидных решётчатых иерархий. Так как в интерфейсах любой член

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

индексатора или события, то никаких коллизий не возникает. Покажем и поясним

это на условном примере. В следующей программе построена ромбовидная иерархия

интерфейсов "интерфейс:иерархия интерфейсов" :

// 14_07.cs – множественное наследование интерфейсов

using System;

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