Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ProgBasics_lec07_polymorphism

.pdf
Скачиваний:
9
Добавлен:
14.04.2015
Размер:
467 Кб
Скачать
☆

Полиморфизм

Полиморфизм – возможность использовать одно имя для решения нескольких схожих, но технически разных задач, или обращаться к объектам разного типа.

Полиморфизм – множественность форм.

Полиморфизм – возможность единообразной обработки данных.

Полиморфизм

•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();

}

}