Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемФилипп Алачев
1 Полиморфизм
2 Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
3 Виртуальные методы Виртуальным называется такой метод, который объявляется как virtual в базовом классе. Виртуальный метод отличается тем, что он может быть переопределен в одном или нескольких производных классах. Следовательно, у каждого производного класса может быть свой вариант виртуального метода. Вариант выполняемого виртуального метода выбирается по типу объекта, а не по типу ссылки на этот объект. Так, если базовый класс содержит виртуальный метод и от него получены производные классы, то при обращении к разным типам объектов по ссылке на базовый класс выполняются разные варианты этого виртуального метода. Метод объявляется как виртуальный в базовом классе с помощью ключевого слова virtual, указываемого перед его именем. Когда же виртуальный метод переопределяетсяв производном классе, то для этого используется модификатор override. А сам процесс повторного определения виртуального метода в производном классе называется переопределением метода. При переопределении имя, возвращаемый тип и сигнатура переопределяющего метода должны быть точно такими же, как и у того виртуального метода, который переопределяется. Кроме того, виртуальный метод не может быть объявлен как static или abstract. Переопределение метода служит основанием для воплощения одного из самых эффективных в C# принципов: динамической диспетчеризации методов, которая представляет собой механизм разрешения вызова во время выполнения, а не компиляции. Значение динамической диспетчеризации методов состоит в том, что именно благодаря ей в C# реализуется динамический полиморфизм.
4 Пример. Создадим базовый класс виртуальным методом и два класса потомка, которые переопределяют данный метод. class Base { // Создать виртуальный метод в базовом классе. public virtual void Who(Label l) { l.Text="Метод Who() в классе Base"; } class Derivedl : Base { // Переопределить метод Who() в производном классе. public override void Who(Label l) { l.Text="Метод Who() в классе Derivedl"; } class Derived2 : Base { // Вновь переопределить метод Who() в еще одном производном классе. public override void Who(Label l) { l.Text="Метод Who() в классе Derived2"; }
5 Если в производном классе не предоставляется собственный вариант виртуального метода, то используется его вариант из базового класса. Если при наличии многоуровневой иерархии виртуальный метод не переопределяется в производном классе, то выполняется ближайший его вариант, обнаруживаемый вверх по иерархии. private void button1_Click(object sender, EventArgs e) { Base b = new Base(); Derivedl d1 = new Derivedl(); Derived2 d2 = new Derived2(); b.Who(label1); d1.Who(label2); d2.Who(label3); }
6 Что дает переопределение методов Благодаря переопределению методов в C# поддерживается динамический полиморфизм. В объектно-ориентированном программировании полиморфизм играет очень важную роль, потому что он позволяет определить в общем классе методы, которые становятся общими для всех производных от него классов, а в производных классах определить конкретную реализацию некоторых или же всех этих методов. Переопределение методов это еще один способ воплотить в C# главный принцип полиморфизма: один интерфейс множество методов. Удачное применение полиморфизма отчасти зависит от правильного понимания той особенности, что базовые и производные классы образуют иерархию, которая продвигается от меньшей к большей специализации. При надлежащем применении базовый класс предоставляет все необходимые элементы, которые могут использоваться в производном классе непосредственно. А с помощью виртуальных методов в базовом классе определяются те методы, которые могут быть самостоятельно реализованы в производном классе. Таким образом, сочетая наследование с виртуальными методами, можно определить в базовом классе общую форму методов, которые будут использоваться во всех его производных классах.
7 Пример. Составить программу с одним родительским классом и двумя потомками. Потомки должны содержать виртуальные функции. Создать виртуальную функцию выдачи результатов расчета методов на экран монитора с указанием названий и полей и их значений соответствующего объекта. Составить тестирующую программу с выдачей протокола на экран монитора. При этом создать объекты базового и производных типов, используя полиморфный контейнер - массив ссылок базового класса на объекты базового и производных классов (количество объектов >=5). Варианты Родительский класс ПотомкиПолиморфные методы 1. Трехмерная Фигура (поле название) Конус(радиус r, h – высота) Правильная четырехугольная пирамида (а – сторона квадрата, h- апофема, т.е. высота ) Расчет площади
8 Диаграмма классов
9 Описание классов Базовый класс для трехмерной фигуры
10 Класс для конуса Класс для пирамиды
11 Основная программа
12 Применение абстрактных классов Иногда требуется создать базовый класс, в котором определяется лишь самая общая форма для всех его производных классов, а наполнение ее деталями предоставляется каждому из этих классов. В таком классе определяется лишь характер методов, которые должны быть конкретно реализованы в производных классах, а не в самом базовом классе. Подобная ситуация разрешается двумя способами. Один из них, состоит в том, чтобы просто выдать предупреждающее сообщение. Второй состоит в использовании абстрактного метода. Абстрактный метод создается с помощью указываемого модификатора типа abstract. У абстрактного метода отсутствует тело, и поэтому он не реализуется в базовом классе. Это означает, что он должен быть переопределен в производном классе, поскольку его вариант из базового класса просто непригоден для использования. Абстрактный метод автоматически становится виртуальным и не требует указания модификатора virtual. В действительности совместное использование модификаторов virtual и abstract считается ошибкой.
13 Для определения абстрактного метода служит приведенная ниже общая форма. abstract тип имя(список_параметров); У абстрактного метода отсутствует тело. Модификатор abstract может применяться только в методах экземпляра, но не в статических методах (static). Абстрактными могут быть также индексаторы и свойства. Класс, содержащий один или больше абстрактных методов, должен быть также объявлен как абстрактный, и для этого перед его объявлением class указывается модификатор abstract. А поскольку реализация абстрактного класса не определяется полностью, то у него не может быть объектов. Следовательно, попытка создать объект абстрактного класса с помощью оператора new приведет к ошибке во время компиляции. Когда производный класс наследует абстрактный класс, в нем должны быть реализованы все абстрактные методы базового класса. В противном случае производный класс должен быть также определен как abstract. Таким образом, атрибут abstract наследуется до тех пор, пока не будет достигнута полная реализация класса.
14 Пример. Составить программу с абстрактным родительским классом и двумя объектами - потомками. Для этого модифицировать задание 1. Составить тестирующую программу с выдачей протокола на экран монитора. В ней нужно реализовать циклический вывод параметров объектов, используя полиморфный контейнер - массив объектов базового класса (количество объектов >=5). Задание. Найти объект с максимальной площадью. Базовый класс для трехмерной фигуры Класс для конуса
15 Класс для пирамиды
16 Основная программа
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.