Головна‎ > ‎C#‎ > ‎Класи‎ > ‎

Поліморфізм

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