Поліморфізм

1. Можливість об'єктів з однаковою специфікацією мати різну реалізацію (багато форм)

2. Це використання спільного інтерфейсу для обробки різних типів даних

3. Усі if можна замінити на поліморфізм (дерево з успадкуванням)

4. Може зменшувати розмір програми в рази

5. Можемо визивати код з класів наслідників

6. Який метод визивати вирішується вже під час роботи програми  (динамічне зв'язування)

7. Аби зобов'язати нащадків реалізувати базовий метод, метод і базовий клас робимо abstract

[ Приклад для співбесіди ]

1. Поліморфізм підтипів (працює лише разом з успадкуванням)

Через клас

// віртуальними можуть бути лише методи

class A

{

     public virtual void Y()  

     {               

          Console.WriteLine("A");

     }

}

class B : A

{

     public override void Y()   

     {                

          Console.WriteLine("B");

     }

}

class C : A

{

     public override void Y() 

     {               

          Console.WriteLine("C");

     }

}

class D : A

{

}

static void Main(string[] args)

{

     A b = new B();

     b.Y();

     A c = new C();

     c.Y();

     A d = new D();

     d.Y();

     A[] arr = {b, c, d};

     Console.ReadLine();

}

// без override було б А А А, 

// бо базовий метод переписує методи нащадків

B

С

A

Через інтерфейс

public interface ICar{

     void refuel();

}

public class NormalCar : ICar{

     public void refuel()

     {

          Console.WriteLine("Заправиться пальним");

     }

}

public class ElectricCar : ICar

{

     public void refuel()

     {

          Console.WriteLine("Підзарядитися");

     }

}

static void Main(string[] args)

{

     List<ICar> cars = new List<ICar>(){

          new NormalCar(),

          new ElectricCar()

     };

     cars.ForEach(x => x.refuel());

     Console.ReadKey();

}

Заправиться пальним

Підзарядитися

2. Перевантаження функцій (Ad hoc поліморфізм)

public static int sumInt(int a, int b) { 

    return a + b; 

public static int sumInt(string a, string b) { 

    int _a, _b; 

    if(!Int32.TryParse(a, out _a)) _a = 0; 

    if(!Int32.TryParse(b, out _b)) _b = 0; 

    return _a + _b; 

public static int sumInt(string a, int b) { 

    int _a; 

    if(!Int32.TryParse(a, out _a)) _a = 0; 

    return _a + b; 

public static int sumInt(int a, string b) { 

    return sumInt(b,a); 

}

---------------------

Console.WriteLine(sumInt("3", 5 ));

8

3. Параметричний поліморфізм (generics)

class A<T>

{

     public T value;

     public A(T b) {

          value = b;

     }         

}

static void Main(string[] args)

{

     A<double> b = new A<double>(6.1);

     Console.WriteLine(b.value);

     Console.ReadKey();

}

6,1