Поліморфізм
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