C# Поліморфізм

2075 / C# / Класи / Поліморфізм

  1. Можливість об'єктів з однаковою специфікацією мати різну реалізацію
  2. Використання спільного інтерфейсу для обробки різних типів даних
  3. Усі if можна замінити на поліморфізм 
  4. Може зменшувати розмір програми в рази
  5. Можемо визвати код з похідних класів (нащадків)
  6. Який метод визвати вирішується вже під час роботи програми (динамічне зв'язування)
  7. Віртуальними можуть бути лише методи
  8. Аби зобов'язати нащадків реалізувати базовий метод, метод (і базовий клас) робимо abstract
  9. Приклад для співбесіди

 


1. Поліморфізм підтипів

 

Через клас (віртуальними можуть бути лише методи)

class A
{
     public virtual void F1()
     {
          Console.WriteLine("A");
     }
}

class B : A
{
     public override void F1()
     {
          Console.WriteLine("B");
     }
}

class C : A
{
     public override void F1()
     {
          Console.WriteLine("C");
     }
}

class D : A
{
     public override void F1() { 
          Console.WriteLine("D"); 
     }
}

static void Main(string[] args)
{
     B b = new B();
     C c = new C();
     D d = new D();

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

     for (int i = 0; i < arr.Length; i++)
     {
           arr[i].F1();
     }

     Console.ReadKey();
}

B
C
D

Без override (поліморфізму) було б А А А, бо базовий метод переписує методи нащадків

 

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

        
public interface IA
{
     void F1();
}

public class B : IA
{
     public void F1()
     {
          Console.WriteLine("B");
     }
}

public class C : IA
{
     public void F1()
     {
          Console.WriteLine("C");
     }
}

public class D : IA
{
     public void F1()
     {
          Console.WriteLine("D");
     }
}

static void Main(string[] args)
{
     B b = new B();
     C c = new C();
     D d = new D();

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

     for (int i = 0; i < arr.Length; i++)
     {
          arr[i].F1();
     }
     Console.ReadKey();
}

 

B
C
D

 

 


 

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

 

public static int Sum(int a, int b)
{
     return a + b;
}

public static int Sum(int a, int b, int c)
{
     return a + b + c;
}

public static int Sum(string a, string b)
{
     if (a == "two" && b == "two") {
          return 4;
     }
          return -1;
}

static void Main(string[] args)
{
     Console.WriteLine( Sum(1, 1) );
     Console.WriteLine( Sum(1, 1, 1) );
     Console.WriteLine( Sum("two", "two") );
     Console.ReadKey();
}

 

2
3
4

 


 

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