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

ProgBasics_lec07_polymorphism

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

Полиморфизм

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

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

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

Полиморфизм

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

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]