Поиск…


Другой пример полиморфизма

Полиморфизм является одним из столпов ООП. Поли происходит от греческого термина, что означает «множественные формы».

Ниже приведен пример, демонстрирующий полиморфизм. Класс 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());
}

Выход будет следующий:

Заправка бензином
Зарядка аккумулятора



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow