C# Language
Полиморфизм
Поиск…
Другой пример полиморфизма
Полиморфизм является одним из столпов ООП. Поли происходит от греческого термина, что означает «множественные формы».
Ниже приведен пример, демонстрирующий полиморфизм. Класс Vehicle
принимает несколько форм в качестве базового класса.
Производные классы Ducati
и Lamborghini
наследуют от Vehicle
и переопределяют метод Display()
базового класса для отображения собственных NumberOfWheels
.
public class Vehicle
{
protected int NumberOfWheels { get; set; } = 0;
public Vehicle()
{
}
public virtual void Display()
{
Console.WriteLine($"The number of wheels for the {nameof(Vehicle)} is {NumberOfWheels}");
}
}
public class Ducati : Vehicle
{
public Ducati()
{
NoOfWheels = 2;
}
public override void Display()
{
Console.WriteLine($"The number of wheels for the {nameof(Ducati)} is {NumberOfWheels}");
}
}
public class Lamborghini : Vehicle
{
public Lamborghini()
{
NoOfWheels = 4;
}
public override void Display()
{
Console.WriteLine($"The number of wheels for the {nameof(Lamborghini)} is {NumberOfWheels}");
}
}
Ниже приведен фрагмент кода, в котором проявляется полиморфизм. Объект создается для базового типа Vehicle
использующее переменное vehicle
в строке 1. Он вызывает метод базового класса Display()
в строке 2 и отображает вывод, как показано.
static void Main(string[] args)
{
Vehicle vehicle = new Vehicle(); //Line 1
vehicle.Display(); //Line 2
vehicle = new Ducati(); //Line 3
vehicle.Display(); //Line 4
vehicle = new Lamborghini(); //Line 5
vehicle.Display(); //Line 6
}
В строке 3 объект vehicle
указывается на производный класс Ducati
и вызывает его метод Display()
, который отображает вывод, как показано. А вот полиморфное поведение, даже если объект vehicle
имеет тип Vehicle
, он вызывает производный метод класса Display()
в качестве типа Ducati
переопределяет базовый класс Display()
метод, так как vehicle
объект направлен в стороне Ducati
.
Такое же объяснение применимо, когда оно вызывает метод Display()
типа Lamborghini
.
Результат показан ниже
The number of wheels for the Vehicle is 0 // Line 2
The number of wheels for the Ducati is 2 // Line 4
The number of wheels for the Lamborghini is 4 // Line 6
Типы полиморфизма
Полиморфизм означает, что операция может также применяться к значениям некоторых других типов.
Существует несколько типов полиморфизма:
- Специальный полиморфизм:
содержитfunction overloading
. Цель состоит в том, что метод может использоваться с разными типами без необходимости генерации. - Параметрический полиморфизм:
является использование общих типов. См. Generics - Подтипы:
имеет целевое наследование класса для обобщения аналогичной функциональности
Специальный полиморфизм
Целью Ad hoc polymorphism
является создание метода, который может быть вызван различными типами данных без необходимости преобразования типов в вызове функции или дженериках. Следующие методы sumInt(par1, par2)
могут вызываться с различными типами данных и для каждой комбинации типов имеют собственную реализацию:
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);
}
Вот пример вызова:
public static void Main()
{
Console.WriteLine(sumInt( 1 , 2 )); // 3
Console.WriteLine(sumInt("3","4")); // 7
Console.WriteLine(sumInt("5", 6 )); // 11
Console.WriteLine(sumInt( 7 ,"8")); // 15
}
Подтипы
Подтипирование - это использование наследования из базового класса для обобщения аналогичного поведения:
public interface Car{
void refuel();
}
public class NormalCar : Car
{
public void refuel()
{
Console.WriteLine("Refueling with petrol");
}
}
public class ElectricCar : Car
{
public void refuel()
{
Console.WriteLine("Charging battery");
}
}
Оба класса NormalCar
и ElectricCar
теперь имеют способ дозаправки, но их собственная реализация. Вот пример:
public static void Main()
{
List<Car> cars = new List<Car>(){
new NormalCar(),
new ElectricCar()
};
cars.ForEach(x => x.refuel());
}
Выход будет следующий:
Заправка бензином
Зарядка аккумулятора