ПОЛИМОРФИЗМ Лекция 3 1
π ολυμορφισμός 2 Полиморфизм кристаллов – углерод: графит, алмаз. Гендерный полиморфизм – человек: мужчина, женщина. Полиморфизм пород – собака: болонка, мопс, бультерьер,…
Полиморфизм в программировании 3 П. нужен для того, чтобы решать разные по существу задачи при помощи одного и того же кода. П. упрощает жизнь программистам и удешевляет программы, т.к. увеличивает степень повторного использования кода. Простые примеры П. 1)знак + означает сложение чисел и соединение строк; 2)функция len() В Питоне определяет длину строк, списков, кортежей; 3)метод Console.Write(x) способен вывести на экран все что угодно; 4)цикл foreach применяется к массивам, коллекциям, пользовательским классам и к итераторам (итератор – вид алгоритма).
Виды программного полиморфизма 4 Ситуативный (Ad hoc) Один и тот же код (операция, функция) выполняется по-разному для разных типов своих аргументов, при этом число возможных типов ограничено и заранее известно. Пример - перегрузка операций и методов, например, операция / для вещественных и целых, метод Console.Write(). Параметрический Код имеет параметры, от которых зависит результат его выполнения. Пример – обобщенные функции и типы, например, List В Питоне – функции для последовательностей: len(L), max(L), sorted(L),… Полиморфизм наследования Достигается путем наследования разными классами общего предка с виртуальными методами.
Не виртуальные методы 5 При вызове обычного метода, компилятор руководствуется типом ссылки на объект. class Point { public int X {set; get;} public int Y {set; get;} public void Print() { Console.WriteLine("x={0} y={1}", X, Y); } class ColPoint : Point { public Color C { set; get; } public void Print() { Console.WriteLine("x={0} y={1} c={2}", X, Y, C); } Point p = new ColPoint(); p.Print(); // x=0 y=0
Виртуальные методы 6 class Point { public int X {set; get;} public int Y {set; get;} public virtual void Print() { Console.WriteLine("x={0} y={1}", X, Y); } class ColPoint : Point { public Color C { set; get; } public override void Print() { Console.WriteLine("x={0} y={1} c={2}", X, Y, C); } При вызове виртуального метода учитывается истинный тип объекта. Point p = new ColPoint(); p.Print(); // x=0 y=0 c=Black
Полиморфизм в действии 7 Имеется массив точек, простых и цветных вперемежку. Распечатать его.
Как устроены виртуальные методы 8 Связывание – замена вызова метода по имени переходом по адресу метода. Раннее связывание – происходит во время компиляции. Позднее связывание – происходит во время выполнения программы. Обычные методы подвергаются раннему связыванию. Виртуальные методы требуют позднего связывания.
Почему не все методы виртуальные 9 1. Позднее связывание отнимает время у выполнения программы. 2. Это время может оказаться значительным, если цепочка наследования длинная. Позднее связывание начинается с поиска метода в классе объекта вызова. Если метода в этом классе нет, поиск проводится в классе родителя, и т.д., пока метод не будет найден.
Перекрытие виртуальных методов 10 Метод однажды виртуальный – всегда виртуальный. Б.Страуструп (предположительно) virtual – виртуальный override – замещает new – перекрывает
11
Пример: Модель редактора 12 Рисунок в графическом редакторе состоит из фигур – отрезков прямых, прямоугольников, окружностей и т.п. Разработать систему классов для модели графического редактора. Picture Figure[] figures Figure int X, Y Rect int W, H Circle int W, H Здесь не полиморфное наследование
Полиморфное наследование 13 Picture Figure[] figures Figure int X, Y, W, H RectCircle Figure – полиморфный тип. Он должен иметь все методы и свойства, какие есть у потомков.
Абстрактные классы 14 Абстрактные классы нельзя инстанцировать, их можно только наследовать. Picture Figure[] figures Figure int X, Y, W, H RectCircle
Самостоятельно 15 Разработайте систему классов для обслуживания газетного киоска: «Товар», «Журнал», «Газета» с общим предком «Товар». В киоске должна быть кассовая книга (класс «Касса»), в которой регистрируются акты получения и продажи товара.