
- •Ооп, как идеология программирования. Отличия от предшествующих подходов, применяемых в программировании ранее. Полный.
- •Основные понятия ооп: класс, объект, поле, свойство, метод, событие. Реализация событий с помощью модели делегатов. Полный.
- •Понятие класса в ооп. Синтаксис объявления класса. Члены класса. Полный.
- •Объекты в ооп. Принадлежность объекта типу (связь между типом и объектом). Жизненный цикл объектов: создание и разрушение объектов. Garbage Collector и разрушение объектов. Полный.
- •Конструкторы: понятие, назначение, примеры применения. Параметризованные конструкторы. Конструкторы «по-умолчанию». Скрытые (private) конструкторы. Полный.
- •Инкапсуляция: понятие, назначение, примеры применения. Ограничение области видимости членов класса (private, public, protected, internal). Полный.
- •Инкапсуляция. Реализация механизма инкапсуляции через свойства. Функции-аксессоры (set, get). Отсутствие или ограничение области видимости одного из аксессоров. Неполный (?).
- •Наследование: понятие, назначение, примеры применения. Поведение различных членов класса при наследовании. Совпадения сигнатур методов при наследовании. Полный.
- •Агрегация: понятие, назначение, примеры применения. Отличия от наследования. Жизненный цикл агрегируемых объектов. Полный (?).
- •Методы класса. Сигнатура метода. Абстрактные (abstract), виртуальные (virtual) и перезаписанные (override) методы. Статические (static) методы классов и особенности их применения. Полный.
- •Полиморфизм: понятие, назначение, примеры применения. Суть принципа «один интерфейс – множество методов». Полный (?).
- •Функциональный тип – делегаты: понятие, назначение, примеры применения. Функция, как экземпляр делегата. Делегат, как свойство класса. Неполный.
- •Программный проект: консольный, оконный. Файлы, составляющие проект. Исполняемые файлы (*.Ехе). Понятие «сборки» в .Net. Ничего.
- •Соглашение о совместимости и преобразование типов. Явные и неявные преобразования. Класс Convert.
- •Переменные и выражения. Области видимости и жизни переменных. Глобальные и локальные переменные. Константы. Полный.
- •Логические операции, условные выражения. Операции проверки типа и приведения к типу. Полный.
- •Структуры (struct) и перечисления (enum). Отличия структур от классов. Полный.
Полиморфизм: понятие, назначение, примеры применения. Суть принципа «один интерфейс – множество методов». Полный (?).
Полиморфизм («поли» — много, «морф» — форма; многоформность) — возможность использования одинаковых (тождественных) имен для различных членов класса.
В ООП проявляется в 3 видах:
Возможность использования тождественных имен в различных классах.
Перегрузка. Возможность использования тождественных имен в рамках одного класса.
Аппарат виртуальных методов. Переопределение виртуальных методов в производных суперкласса.
Смысл полиморфизма: «Один интерфейс — множество реализаций». Например, реализация суперкласса может быть изменена в его наследниках.
Исключительные ситуации: понятие, назначение, примеры применения. Иерархия исключений. Создание (throw) и перехват (try-catch-finally) объектов-исключений. Способы реагирования на исключительные ситуации. Исключения, которые нельзя перехватить. Неполный.
Исключительная ситуация — ситуация, при которой нарушается ожидаемая логика работы программы.
Для обработки исключительной ситуации ОС генерирует событие и создает объект, содержащий ее описание.
Назначение — извещение пользователя об ошибке, и, по-возможности, устранение последствий ошибки.
В С# исключения представляются классами. Все исключения являются подклассами класса Exception (который является частью пространства имен System).
Управление С#-механизмом обработки исключений основывается на четырех ключевых словах: try, catch, throw и finally.
Программные инструкции, которые нужно проконтролировать на предмет исключений, помещаются в try-блок. Если исключение возникает в этом блоке, оно дает знать о себе выбросом определенного рода информации.
Это выброшенное исключение может быть перехвачено программным путем с помощью catch-блока и обработано соответствующим образом.
Системные исключения автоматически генерируются С#-системой динамического управления. Чтобы сгенерировать исключение вручную, используется ключевое слово throw.
Любой код, который должен быть обязательно выполнен при выходе из try-блока, помещается в блок finally.
Ядром обработки исключений являются блоки try и catch. Эти ключевые слова работают "в одной связке"; нельзя использовать одно отдельно от другого.
Вот каков формат записи try/catch-блоков обработки исключений:
try
{
// Блок кода, подлежащий проверке на наличие ошибок.
}
catch (ExcepType1 ex)
{
// Обработчик для исключения типа ExcepTypel.
}
catch (ExcepType2 ex)
{
// Обработчик для исключения типа ЕхсерТуре2.
}
ЕхсерТуре — тип сгенерированного исключения. После "выброса" исключение перехватывается соответствующей инструкцией catch, которая его обрабатывает. Как видно из формата записи try/catch-блоков, с try-блоком может быть связана не одна, а несколько catch-инструкций. Какая именно из них будет выполнена, зависит от типа исключения.
Интерфейсы: понятие, назначение, примеры применения. Реализация интерфейсов. Приведение к интерфейсу. Коллизия имен при реализации двух и более интерфейсов. Назначение интерфейсов IComparable, IClonable, ISerializeable. Неполный.
Интерфейс — абстрактный класс, все методы которого определены, но не реализованы. Синтаксис аналогичен синтаксису класса.
Интерфейс определяет поведение, которое поддерживается реализующими этот интерфейс классами. В классе, который наследует интерфейс, должна быть реализованы все объявленные методы. Если класс наследует иерархию интерфейсов, все их методы, должны быть реализованы.
Основная идея использования интерфейса состоит в том, чтобы к объектам таких классов можно было обращаться одинаковым образом. То есть, интерфейсы служат для унификации.
Отличия интерфейса от абстрактного класса:
элементы интерфейса по умолчанию имеют спецификатор доступа public и не могут иметь спецификаторов, заданных явным образом;
интерфейс не может содержать полей и обычных методов — все элементы интерфейса должны быть абстрактными;
класс, в списке предков которого задается интерфейс, должен определять все его элементы, в то время как потомок абстрактного класса может не переопределять часть абстрактных методов предка (в этом случае производный класс также будет абстрактным);
класс может иметь в списке предков несколько интерфейсов, при этом он должен определять все их методы.