2075 / C# / Класи / Поліморфізм
- Можливість об'єктів з однаковою специфікацією мати різну реалізацію
- Використання спільного інтерфейсу для обробки різних типів даних
- Усі if можна замінити на поліморфізм
- Може зменшувати розмір програми в рази
- Можемо визвати код з похідних класів (нащадків)
- Який метод визвати вирішується вже під час роботи програми (динамічне зв'язування)
- Віртуальними можуть бути лише методи
- Аби зобов'язати нащадків реалізувати базовий метод, метод (і базовий клас) робимо abstract
- Приклад для співбесіди
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
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
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
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