
ProgBasics_lec07_polymorphism
.pdf
class Program
{
static void Main()
{
Number n1 = new Number(); n1++;
n1++;
Number n2 = n1 + 5;
Console.WriteLine("n1 = {0}, n2 = {1}", n1, n2);
}
}

Полиморфизм подтипов
Виртуальный метод – такой метод, который может быть переопределён в классахнаследниках.
Определение конкретной реализации для вызова происходит во время выполнения.
Это называется «поздним связыванием». Что же тогда такое – раннее связывание?

Зачем?
•Позволяет обеспечить единообразное поведение с одним и тем же интерфейсом
То есть, можно создать общий интерфейс для группы близких по смыслу действий.

class Number
{
public virtual Number Add(Number n1, Number n2)
{
return new Number();
}
}
public class Integer : Number
{
public override Number Add(Number n1, Number n2) { … }
}
public class ComplexNumber : Number
{
public override Number Add(Number n1, Number n2) { … }
}

usage
Number integer = new Integer(); Number a = new Integer(); Number b = new Integer(); ComplexNumber complNumber =
new ComplexNumber();
integer.Add(a, b);

Абстрактные классы
•Нельзя создавать экземпляры
•Может содержать абстрактные элементы
–может, а не обязан!
•Не могут быть помечены, как sealed
•Представляют наиболее общую абстракцию

Абстрактные классы
abstract class Number
{
public virtual Number Add(Number n1, Number n2)
{
return new Number();
}
}

Абстрактные классы
abstract class Number
{
public abstract Number Add(Number n1, Number n2);
}

sealed
Позволяет:
•создавать бесплодные (запечатанные) классы
•запрещать переопределять методы, свойства, и т.д., в потомках
sealed class A |
{ |
} |
class B : A { |
} |
//будет ошибка компиляции |

selaed
public class Integer : Number
{
public sealed override Number Add(Number n1, Number n2)
{ … }
}