Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
21-29.docx
Скачиваний:
1
Добавлен:
25.09.2019
Размер:
28.82 Кб
Скачать

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

В языке C# запрещено множественное наследование классов. Тем не менее, в C# существует концепция, позволяющая имитировать множественное наследование. Эта концепция интерфейсов. Интерфейс представляет собой набор объявлений свойств, индексаторов, методов и событий. Класс или структура могут реализовывать определенный интерфейс. В этом случае они берут на себя обязанность предоставить полную реализацию элементов интерфейса (хотя бы пустыми методами). Можно сказать так: интерфейс – это контракт, пункты которого суть свойства, индексаторы, методы и события. Если пользовательский тип реализует интерфейс, он берет на себя обязательство выполнить этот контракт.

Объявление интерфейса схоже с объявлением класса. Для объявления интерфейса используется ключевое слово interface. Интерфейс содержит только заголовки методов, свойств и событий:

interface IBird {

// Метод

void Fly();

// Свойство

double Speed { get; set;}

}

Считается, что все элементы интерфейса имеют public уровень доступа.

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

Если класс реализует несколько интерфейсов, которые имеют элементы с совпадающими именами, или имя одного из членов класса совпадает с именем элемента интерфейса, то при записи члена класса требуется указать имя в виде <имя интерфейса>.<имя члена>. Указание модификаторов доступа при этом запрещается.

Подобно классам, интерфейсы могут наследоваться от других интерфейсов. При этом, в отличие от классов, наследование интерфейсов может быть множественным.

28. Параметризация классов. Ключевое слово where.

Обобщенные (или параметризованные) типы (generics) позволяют при описании пользовательских классов, структур, интерфейсов, делегатов и методов указать как параметр тип данных для хранения и обработки.

Классы, описывающие структуры данных, обычно используют базовый тип object, чтобы хранить данные любого типа.

Для структурных типов (таких как int) при помещении данных в стек и при извлечении выполняются операции упаковки и распаковки, что отрицательно сказывается на быстродействии. И, наконец, неверный тип помещаемого в стек элемента может быть выявлен только на этапе выполнения, но не компиляции.

Основной причиной появления обобщенных типов была необходимость устранения описанных недостатков универсальных классов.

В C# для каждого параметра обобщенного типа может быть задан список ограничений (constraints). Только тип, удовлетворяющий ограничениям, может быть применен для записи сконструированного типа.

Ограничения объявляются с использованием ключевого слова where, после которого указывается параметр, двоеточие и список ограничения. Элементом списка ограничения могут являться интерфейсы, класс (только один) и ограничение на конструктор.

29. Стандартные интерфейсы iEnumerable и iEnumerator.

Интерфейс IEnumerable, который появляется на всей программы на C#. Он указывает, что базовый тип реализует метод GetEnumerator. Это позволяет использовать цикл foreach. Она часто взаимодействует с методы из пространства имен System.Linq. Цикл foreach предназначен для опроса элементов коллекции. Коллекция — это группа объектов. В С# определено несколько типов коллекций, среди которых можно выделить массив. Формат записи цикла foreach имеет такой вид:foreach (тип имя__переменной in коллекция) инструкция;

Здесь элементы тип и имя_переменной задают тип и имя итерационной переменной, которая при функционировании цикла fоreach будет получать значения элементов из коллекции. Элемент коллекция служит для указания опрашиваемой коллекции (в данном случае в качестве коллекции мы рассматриваем массив). Таким образом, элемент тип должен совпадать (или быть совместимым) с базовым типом

массива. Здесь важно запомнить, что итерационную переменную применительно к массиву можно использовать только для чтения. Следовательно, невозможно изменить содержимое массива, присвоив итерационной переменной новое значение. Цикл foreach последовательно опрашивает элементы массива в направлении от наименьшего индекса к наибольшему.

Несмотря на то что цикл foreach работает до тех пор, пока не будут опрошены все элементы массива, существует возможность досрочного его останова с помощью инструкции break. Цикл foreach работает и с многомерными массивами. В этом случае он возвращает элементы в порядке следования строк: от первой до последней. Поскольку цикл foreach может опрашивать массив последовательно (от начала к

концу), может сложиться впечатление, что его использование носит весьма ограниченный характер. Однако это не так. Для функционирования широкого круга алгоритмов требуется именно такой механизм. Одним из них является алгоритм поиска. Цикл foreach также используется для вычисления среднего значения, определения минимального или максимально числа в наборе чисел, поиска дубликатов и т.д.

Интерфейс IEnumerator, собственно, и определяет действие любого нумератора. Используя его методы, можно циклически опросить содержимое коллекции. Для коллекций, в которых хранятся пары ключ/значение (т.е. словари), метод GetEnumerator () возвращает объект типа IDictionaryEnumerator, а не типа IEnumerator. Класс IDictionaryEnumerator является производным от класса IEnumerator и распространяет свои функциональные возможности нумератора на область словарей.

30. Стандартные итераторы. Создание методов итератора yield.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]