ProgBasics_lec07_polymorphism
.pdfПолиморфизм
Полиморфизм – возможность использовать одно имя для решения нескольких схожих, но технически разных задач, или обращаться к объектам разного типа.
Полиморфизм – множественность форм.
Полиморфизм – возможность единообразной обработки данных.
Полиморфизм
•ad-hoc
–перегрузка методов
–переопределение операторов
•полиморфизм подтипов
•параметрический
–generics (обобщения)
ad-hoc
•1 + 2 = 3
•3.14 + 0.0015 = 3.1415
•1 + 3.7 = 4.7
void Write(string message); void Write(int number);
Console.Write(1);
Console.Write("A!");
Перегрузка методов
Осуществляется по типу и(или) числу параметров
Механизм разрешения перегрузки:
•Из множества методов-кандидатов на вызов убираются методы с неприемлемыми списками аргументов
–возможна ошибка компиляции, если множество останется пустым
•В полученном множестве ищется наиболее подходящий для вызова метод
–«подходящий» – с точки зрения списка аргументов
–если возникнет неоднозначность в выборе – будет ошибка компиляции
Выбор приемлемых методов
•количество аргументов вызванного метода совпадает с их количеством в объявлении
•для каждого аргумента вызванного метода совпадают способы передачи параметров с объявлением метода (value, ref/out)
Выбор лучшего для вызова метода
Допустим, что существуют:
•множество типов аргументов А
•два метода, MP и MQ, из которых выбираем
–{P1, P2, P3, …, PN}, {Q1, Q2, Q3, …, QN} – типы параметров
Метод MP будет выбран, если:
•аргумент Ai возможно преобразовать к Pi, не хуже, чем Ai к Qi
•хотя бы один аргумент Ai преобразовывается к Pi лучше, чем к Qi
Пример, известный всем
(Console.Write)
public static void Write(bool value); public static void Write(char value);
public static void Write(char[] buffer); public static void Write(ulong value); public static void Write(uint value); public static void Write(object value); public static void Write(int value); public static void Write(double value); public static void Write(decimal value);
Перегрузка операторов
public [extern] static <type> operator <op> (<parameters>) body;
•всегда – public static
•возможно – extern
•<op> - перегружаемый оператор
Перегружаемые операторы
•Унарные: + - ! ~ ++ -- true false
•Бинарные:
+, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=
• Преобразования типов:
implicit operator <type> ( <type identifier >) explicit operator <type> ( <type identifier >) <type> - целевой тип
<type identifier> - исходный тип
class Number
{
private int value; public Number() { }
private Number(int val) { this.value = val;
}
public static Number operator +(Number a, Number b) { return new Number {
value = a.value + b.value
};
}
public static Number operator ++(Number n) { Number temp = new Number(n.value); temp.value++;
return temp;
}
public static implicit operator Number(int val) { return new Number(val);
}
public override string ToString() { return value.ToString();
}
}