- •Введение в c# и платформу .Net Философия .Net
- •Введение в строительные блоки платформы .Net (clr, cts и cls)
- •Роль библиотек базовых классов
- •Понятие общей системы типов (cts)
- •Понятие общеязыковой спецификации (cls)
- •Понятие общеязыковой исполняющей среды (clr)
- •Различия между сборками, пространствами имен и типами
- •Лабораторная работа №1. Создание приложений на языке c# без использования ide Роль .Net Framework 4.5 sdk
- •Указание целевых входных и выходных параметров
- •Ссылка на внешние сборки
- •Построение приложений c# с использованием csc.Ехе
- •Компиляция нескольких файлов исходного кода
- •Лабораторная работа №2. Построение приложений .Net с помощью Visual Studio Создание нового проекта
- •Использование утилиты Solution Explorer
- •Ссылка на внешние сборки
- •Утилита Object Browser
- •Фрагменты кода и технология Surround With
- •Утилита Class Designer
- •Лабораторная работа №3. Основы программирования на c# Структура простой программы c#
- •Класс System.Console
- •Форматирование числовых данных
- •Системные типы данных и соответствующие ключевые слова c#
- •Объявление и инициализация переменных
- •Иерархия классов для типов данных
- •Члены числовых типов данных
- •Члены System.Boolean
- •Члены System.Char
- •Работа со строковыми данными
- •Базовые манипуляции строками
- •Управляющие последовательности
- •Итерационные конструкции c#
- •Лабораторная работа №4. Главные конструкции программирования на с# Методы и модификаторы параметров
- •Стандартное поведение передачи параметров по значению
- •Модификатор out
- •Модификатор ref
- •Модификатор params
- •Определение необязательных параметров
- •Вызов методов с использованием именованных параметров
- •Массивы в c# Объявление и инициализация массивов
- •Определение массива объектов
- •Базовый класс System.Array
- •Управление хранилищем, лежащим в основе перечисления
- •Объявление переменных типа перечисления
- •Динамическое извлечение пар “имя/значение” перечисления
- •Типы структур
- •Объектно- ориентированное программирование на c# Лабораторная работа №5. Работа с классами Знакомство с типом класса c#
- •Размещение объектов с помощью ключевого слова new
- •Определение специальных конструкторов
- •Роль ключевого слова this
- •Еще раз о необязательных аргументах
- •Понятие ключевого слова static
- •Определение статических полей данных
- •Определение статических классов
- •Основные принципы объектно-ориентированного программирования
- •Роль инкапсуляции
- •Роль наследования
- •Роль полиморфизма
- •Лабораторная работа №6. Инкапсуляция Модификаторы доступа c#
- •Стандартные модификаторы доступа
- •Первый принцип: службы инкапсуляции c#
- •Инкапсуляция с использованием традиционных методов доступа и изменения
- •Использование свойств внутри определения класса
- •Свойства, доступные только для чтения и только для записи
- •Взаимодействие с автоматическими свойствами
- •Понятие синтаксиса инициализации объектов
- •Работа с данными константных полей
- •Понятие полей, допускающих только чтение
- •Понятие частичных типов
- •Лабораторная работа №7. Наследование Базовый механизм наследования
- •Указание родительского класса для существующего класса
- •Ключевое слово sealed
- •Управление созданием базового класса с помощью ключевого слова base
- •Хранение секретов семейства: ключевое слово protected
- •Добавление запечатанного класса
- •Реализация модели включения/делегации
- •Определения вложенных типов
- •Лабораторная работа №8. Полиморфизм
- •Переопределение виртуальных членов в ide-среде Visual Studio
- •Запечатывание виртуальных членов
- •Абстрактные классы
- •Понятие полиморфного интерфейса
- •Сокрытие членов
- •Правила приведения к базовому и производному классу
- •Ключевое слово as
- •Ключевое слово is
- •Главный родительский класс System.Object
- •Переопределение System.Object.ToString()
- •Переопределение System.Object.Equals()
- •Статические члены System.Object
- •Лабораторная работа №9. Структурированная обработка исключений
- •Роль обработки исключений .Net
- •Строительные блоки обработки исключений в .Net
- •Базовый класс System.Exception
- •Простейший пример
- •Генерация общего исключения
- •Перехват исключений
- •Конфигурирование состояния исключения
- •Исключения уровня приложения (System.ApplicationException)
- •Построение специальных исключений, способ первый
- •Построение специальных исключений, способ второй
- •Обработка нескольких исключений
- •Общие операторы catch
- •Внутренние исключения
- •Какие исключения могут генерировать методы?
- •Результат наличия необработанных исключений
- •Лабораторная работа №10. Работа с интерфейсами Понятие интерфейсных типов
- •Реализация интерфейса
- •Вызов членов интерфейса на уровне объектов
- •Получение ссылок на интерфейсы: ключевое слово as
- •Получение ссылок на интерфейсы: ключевое слово is
- •Использование интерфейсов в качестве параметров
- •Использование интерфейсов в качестве возвращаемых значений
- •Массивы интерфейсных типов
- •Явная реализация интерфейсов
- •Проектирование иерархий интерфейсов
- •Множественное наследование посредством интерфейсных типов
Явная реализация интерфейсов
Как было показано ранее, класс или структура может реализовать любое количество интерфейсов. С учетом этого, всегда существует возможность реализации интерфейсов с членами, имеющими идентичные имена, и, следовательно, возникает необходимость в устранении конфликтов имен.
Чтобы ознакомиться с различными способами решения этой проблемы, создайте новое консольное приложение по имени InterfaceNameClash и добавьте в него три специальных интерфейса, представляющих различные места, в которых реализующий их тип может визуализировать свой вывод:
Обратите
внимание, что каждый из этих интерфейсов
определяет метод по имени Draw() с
идентичной сигнатурой (без аргументов).
Если теперь необходимо поддерживать
все эти интерфейсы в одном классе
Octagon, компилятор позволит использовать
следующее определение:
Хотя
компиляция этого кода пройдет гладко,
одна возможная проблема все же
присутствует. Выражаясь просто,
предоставление единственной реализации
метода Draw() не позволяет предпринимать
уникальные действия на основе того,
какой интерфейс получен от объекта
Octagon. Например, следующий код будет
приводить к вызову одного и того же
метода Draw(), какой бы интерфейс не был
получен:
Очевидно,
что код, требуемый для визуализации
изображения в окне, довольно сильно
отличается от того, который необходим
для вывода изображения на сетевой
принтер или в область памяти. При
реализации нескольких интерфейсов,
имеющих идентичные члены, разрешить
такой конфликт имен можно с использованием
синтаксиса явной реализации интерфейсов.
Взгляните на следующее изменение типа
Octagon:
Как видите, при явной реализации члена интерфейса основной шаблон сводится к следующему:
Обратите
внимание, что при использовании этого
синтаксиса не указывается модификатор
доступа: явно реализованные члены
автоматически являются закрытыми.
Например, следующий синтаксис недопустим:
Поскольку
явно реализованные члены всегда
неявно закрыты, они перестают быть
доступными на уровне объектов. И
действительно, если вы примените к
типу Octagon операцию точки, то обнаружите,
что средство IntelliSense не отображает
никаких членов Draw(). Как и следовало
ожидать, для доступа к требуемой
функциональности должно использоваться
явное приведение. Ниже представлен
пример:
Наряду с тем, что этот синтаксис полезен, когда необходимо устранить конфликты имен, явную реализацию интерфейсов можно применять и просто для сокрытия более “сложных” членов на уровне объектов. В таком случае при использовании операции точки пользователь объекта будет видеть только подмножество всей функциональности типа. Тем не менее, те, кому требуется более сложное поведение, могут извлекать желаемый интерфейс через явное приведение. Доработайте проект для демонстрации явной реализации интерфейсов
