- •Предисловие
- •1 Среда визуального программирования visual studio.Net
- •1.1 Введение в объектно - ориентированное программирование
- •1.2 Понятие о событийном управлении Windows
- •1.3 Основные окна среды Visual Studio.Net
- •1.4 Основные структурные элементы разработки проекта c#
- •1.5 Пример первой учебной программы
- •2.1 Технология визуального проектирования форм
- •1.6 Вопросы для самопроверки
- •2 Элементы управления
- •2.2 Элементы управления панели Toolbox
- •2.3 Пример использования элементов управления
- •2.4 Вопросы для самопроверки
- •3 Графический интерфейс языка c#
- •3.1 Пространство имен System.Drawing
- •3.2 Класс Graphics
- •3.3 Пример программной реализации
- •3.4 Вопросы для самопроверки
- •4 Использование меню в приложении
- •4.1 Меню программы
- •4.2 Создание инструментальной панели приложения
- •4.3.Вопросы для самопроверки
- •5 Использование диалоговых меню
- •5.1 Обработчики событий для работы с матрицей
- •5.2 Обработчик событий для открытия файла
- •5.3 Обработчик событий для записи в файл
- •5.4 Обработчик событий для работы с текстом
- •5.5 Вопросы для самопроверки
- •6 Многооконные приложения
- •6.1 Создание «кнопочной» главной формы
- •6.2 Добавление новых форм приложения
- •6.3 Обработчики событий главной формы
- •6.4 Табличная форма представления и редактирования значений
- •6.5 Графическая форма представления прямоугольников
- •6.6 Вопросы для самопроверки
- •7. Понятие класса
- •7.1 Понятие класса
- •7.2 Состав класса
- •7.3 Методы класса
- •7.4 Структура объекта
- •7.5 Пример учебной программы
- •7.6 Доступ к полям
- •7.7 Вопросы для самопроверки
- •1 Понятие класса?
- •8 Элементы классов
- •8.1 Конструкторы
- •8.2 Деструкторы
- •8.3 Свойства
- •8.4 Параметр по ссылке this
- •8.5 События класса
- •8.6 Перегрузка операций класса
- •8.7 Вопросы для самопроверки
- •9 Принципы ооп
- •9.1 Понятие инкапсуляции
- •9.2 Понятие наследования
- •9.3 Вопросы для самопроверки
- •10 Принцип полиморфизма
- •10.1 Понятие полиморфизма
- •10.2 Пример статического наследования методов
- •10.3 Пример динамического наследования методов
- •10.4 Вопросы для самопроверки
- •11 Использование интерфейсов
- •11.1 Понятие интерфейса
- •11.2 Синтаксис интерфейса
- •11.3 Использование стандартного интерфейса iEnumerable
- •11.4 Вопросы для самопроверки
- •12 Композиция и коллекция классов
- •12.1 Понятие композиции и коллекции класса
- •12.2 Пример использования композиции и коллекции класса
- •12.3 Некоторые коллекции Framework
- •12.4 Коллекция ArrayList
- •12.5 Вопросы для самопроверки
- •13 Делегаты
- •13.1 Понятие делегата
- •13.2 Описание делегата
- •13.3 Пример использования делегата
- •13.4 Совместимость делегатов
- •13.5 Методы базовых классов делегатов
- •13.6 Вопросы для самопроверки
- •14 События
- •14.1 Понятие события
- •14.2 Некоторые часто используемые события среды Visual Studio.Net
- •14.3 Пример использования стандартных событий классов
- •14.4 Нестандартные события классов
- •14.5 Вопросы для самопроверки
- •Приложение а Ответы на вопросы для самопроверки
- •1 Понятие класса?
- •Предметный указатель
- •Список литературы
9.3 Вопросы для самопроверки
1 Как один объект может информировать другой объект об изменении своего состояния?
2 Как называется объект, информирующий другой объект об изменении своего состояния?
3 Как формируется «пустой» обработчик некоторого события?
4 Какой обработчик события будет сформирован, если на форме дважды кликнут на кнопку button1?
5 Для чего используется перегрузка операций в классах?
6 Понятие наследования?
7 Что является целью наследования классов?
8 Как называется класс, свойства, данные и методы которого наследуются другим классом?
9 Как называется класс, наследующий свойства, данные и методы базового класса?
10 На чем базируется объектно - ориентированное программирование?
10 Принцип полиморфизма
10.1 Понятие полиморфизма
Рассмотренное в предыдущей лекции понятие наследования позволяет использовать методы и данные базовых классов, но при этом различают два вида наследования – статическое и динамическое наследование (статическое и динамическое связывание методов).
Статическое наследование это такое наследование, все связи которого формируются во время компиляции программы и фактически определяются в самой структуре описания классов.
Динамическое наследование, и связанное с ним свойство полиморфизма, предполагают, что некоторые связи формируются в процессе выполнения программы.
Полиморфизм это многообразие форм реализации одноименных методов в цепочке наследуемых классов.
Реализация свойства полиморфизма осуществляется с помощью специальных виртуальных методов и, так называемых, абстрактных базовых классов.
Рассмотрим понятие абстрактных базовых классов.
Для получения преимуществ наследования классов разработчики ООП стали создавать базовые классы, включающих в себя все возможные методы обработки данных определенного множества объектов, но, при этом, базовые классы, как правило, не включали элементы данных.
Например, при создании базового класса «геометрические фигуры» можно включить методы нахождения площади или объема. Естественно, если производным классом является класс «точка» или класс «отрезок», то такие методы для этих объектов лишены смысла.
Базовые классы, для которых создание объектов невозможно или не имеет смысла, стали называть абстрактными базовыми классами. Абстрактные базовые классы служат только для порождения потомков. Как правило, в них задаются только наборы методов, которые каждый из потомков будет реализовывать по-своему. Подобные методы абстрактных базовых классов рассчитаны на несуществующие – виртуальные элементы данных (т.е. на элементы данных будущих классов в цепочке наследования).
Методы, рассчитанные на несуществующие, виртуальные элементы данных будущих классов в цепочке наследования, стали называть виртуальными методами.
Для обозначения виртуальных методов в языке C# используется специальное указание (специальный термин – virtual), означающее, что метод является виртуальным. Например:
virtual public double ploc() {return 0.0;}
Слово virtual в переводе с английского значит «фактический». Объявление метода виртуальным означает, что все ссылки на этот метод будут разрешаться по факту его вызова, то есть не на стадии компиляции, а во время выполнения программы. Этот механизм называется поздним или динамическим связыванием методов.
Встретив виртуальные методы, компилятор создаст таблицу виртуальных методов (Virtual Method Table, VMT), в которую поместит названия виртуальных методов и адреса точек входа. Для каждого класса создается одна таблица виртуальных методов.
При этом во время выполнения программы в каждый создаваемый объект дополнительно включается указатель на созданную таблицу VMT.
Вызов виртуального метода выполняется так: из объекта берется адрес его таблицы VMT, из VMT выбирается адрес метода, а затем управление передается этому методу. Таким образом, при использовании виртуальных методов из всех одноименных методов иерархии всегда выбирается тот, который соответствует фактическому типу вызвавшего его объекта.
Если производный класс имеет свою реализацию одноименного виртуального метода, то в нем этот метод должен объявляться как замещающий или перекрывающий метод с атрибутом override. Например,
override public double ploc() { . . . }
Переопределять виртуальный метод в каждом из производных классов не обязательно. Если он выполняет устраивающие производный класс действия, то метод просто наследуется.
На этапе выполнения программы при обращении любого базового класса к замещенному методу в таблицу виртуальных методов помещается ссылка на соответствующий метод производного класса, который и работает так, как если бы он был изначальной частью родительского класса.
Замещающий виртуальный метод должен обладать таким же набором параметров, как и одноименный метод базового класса.
Принцип полиморфизма базируется на «перекрытии» виртуальных методов абстрактного базового класса замещающими методами. При этом каждый производный класс может иметь свою индивидуальную форму реализации наследуемых виртуальных или замещающих методов.
При этом свойство полиморфизма – это возможность для объектов разных классов, связанных наследованием, реагировать различным образом при обращении к одной и той же (по названию) виртуальной функции базового класса.
Полиморфизм, в переводе с греческого языка, означает «много форм», что в данном случае означает «один вызов — много методов».
При описании базовых классов рекомендуется определять в качестве виртуальных те методы, которые в производных классах должны реализовываться по - другому. Если во всех классах иерархии метод будет выполняться одинаково, его лучше определить как обычный метод.
