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

Interface iBase

{

void write();

}

interface IN1 : IBase { }

interface IN2 : IBase { }

interface INt : IN1, IN2 {}

class Class : INt

{

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

}

class Program

{

public static void Main() { }

}

Два интерфейса IN1 и IN2 построены на базе интерфейса IBase. У интерфейса

INt базовыми являются IN1 и IN2. Класс с именем Class реализует интерфейс INt и

тем самым должен реализовать и все остальные интерфейсы. Самое важное – тот

факт, что класс получает для реализации только один экземпляр члена write().

Несмотря на то, что write() как член базового класса наследуется двумя

интерфейсами IN1 и IN2, но в интерфейс INt он входит только один раз и только

один раз должен быть реализован в классе Class. Сказанное иллюстрирует (см. рис.

14.4) диаграмма классов программы.

Рис 14.4. Множественное наследование интерфейсов в программе 14_07.cs

При построении иерархии интерфейсов возможно совпадение имён и сигнатур

членов разных интерфейсов. Если сигнатуры методов не совпадают, то есть

прототипы методов интерфейсов заведомо разные, то ничего предпринимать не

нужно – класс должен реализовать все одноимённые члены, имеющие разные

сигнатуры. В случае совпадения сигнатур член производного интерфейса

экранирует

"экранирует:скрывает"

(скрывает) одноимённый член базового

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

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

модификатором new "модификатор: new" . При экранировании класс не должен

реализовать член базового интерфейса (достаточно реализации экранирующего

члена производного интерфейса).

Следующая программа иллюстрирует приведённые правила:

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

using System;

Interface iBase {

void write();

}

interface IN1 : IBase {

new void write();

}

interface IN2 : IBase {

int write(int r);

}

interface INt : IN1, IN2 {}

class Class : INt {

public void write()

{ Console.WriteLine("IN1"); }

public int write(int r)

{ Console.WriteLine("IN2 "+r); return 1; }

}

class Progra

m

{

public static void Main() {

Class dot = new Class();

dot.write();

dot.write(23);

}

}

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

IN1

IN2 23

В базовом интерфейсе IBase

есть прототип метода write(). В производных

интерфейсах IN1, IN2 декларированы одноимённые методы с разной сигнатурой.

Прототип метода из IN1 экранирует прототип метода базового интерфейса.

Прототип метода из IN2 существует независимо от других одноимённых

прототипов. Класс Class, реазующий всю иерархию интерфейсов, реализует как

перегруженные (overloaded) два метода, декларированные в интерфейсах IN1, IN2.

Результаты выполнения программ и диаграмма классов и интерфейсов (рис. 14.5)

дополняют приведённые объяснения. Обратите внимание на обозначение метода

write() в изображении класса Class. В подписи указано, что существует две

реализации: (+1 overloaded).

Рис 14.5. Множественное наследование интерфейсов с перегрузкой и

экранированием членов интерфейсов

Контрольные вопросы

Что такое наследование реализации?

Что такое наследование специфицированной функциональности?

Какие механизмы C# обеспечивают реализацию наследования специфицированной

функциональности?

Что такое интерфейс?

Какие объявления могут входить в декларацию интерфейса?

В чём отличия интерфейса от класса?

Как проявляется принцип полиформизма при использовании интерфейсов.

Что такое прототип метода и где прототипы используются?

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

Что такое принцип подстановки Лискова

?

Можно ли объявить интерфейс с модификатором static?

Что такое спецификация базы интерфейса?

Какие модификаторы допустимы для члена интерфейса?

Какой статус доступа имеют члены интерфейса?

Приведите формат объявления свойства в интерфейсе.

Какие поля допустимы в объявлении интерфейса?

В чём различия прототипа метода в абстрактном классе от прототипа метода в

интерфейсе?

В чём различия и сходства интерфейса и абстрактного класса?

Что такое реализация члена интерфейса?

Является ли интерфейс типом?

К какому виду типов относится интерфейс?

Доступ к каким членам класса, реализующего интерфейс, обеспечивает ссылка с

типом интерфейса?

Как с помощью интерфейсов обеспечивается динамическое связывание?

Что такое наследование интерфейсов?

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