Sök…


Ett annat exempel på polymorfism

Polymorfism är en av pelarna i OOP. Poly härstammar från en grekisk term som betyder "flera former".

Nedan är ett exempel som visar polymorfism. Klassen Vehicle har flera former som basklass.

Deriverade klasserna Ducati och Lamborghini ärver från Vehicle och åsidosätter basklassens metod Display() för att visa sitt eget 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}");
    }
}

Nedan är kodavsnittet där Polymorphism visas. Objektet skapas för bastyp Vehicle hjälp av ett variabelt vehicle på rad 1. Det kallar basklassmetoden Display() på rad 2 och visar utgången som visas.

 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
 }

Vid linje 3 pekas vehicle på den härledda klassen Ducati och kallar sin Display() -metod, som visar utgången som visas. Här kommer den polymorfa beteende, även om objektet vehicle är av typen Vehicle , anropar den härledda klassen metoden Display() som den typ Ducati åsidosätter basklass Display() metoden, eftersom vehicle objektet är riktad mot Ducati .

Samma förklaring är tillämplig när den åberopar Lamborghini typens Display() -metod.

Utmatningen visas nedan

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

Typer av polymorfism

Polymorfism innebär att en operation också kan tillämpas på värden av vissa andra typer.

Det finns flera typer av polymorfism:

  • Ad hoc-polymorfism:
    innehåller function overloading . Målet är att en metod kan användas med olika typer utan att det är generiskt.
  • Parametrisk polymorfism:
    är användningen av generiska typer. Se Generics
  • subtyp:
    har målet att arva en klass för att generalisera en liknande funktionalitet

Ad hoc-polymorfism

Målet med Ad hoc polymorphism är att skapa en metod, som kan kallas av olika datatyper utan behov av typkonvertering i funktionssamtalet eller generiska. Följande metod (er) sumInt(par1, par2) kan kallas med olika datatyper och har för varje kombination av typer en egen implementering:

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);
}

Här är ett exempelsamtal:

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
}

subtyp

Undertypning är användning av ärv från en basklass för att generalisera ett liknande beteende:

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");    
    }
}

Båda klasserna NormalCar och ElectricCar nu en metod att tanka, men en egen implementering. Här är ett exempel:

public static void Main()
{
    List<Car> cars = new List<Car>(){
        new NormalCar(),
        new ElectricCar()
    };
    
    cars.ForEach(x => x.refuel());
}

Output kommer att följa:

Tankning med bensin
Laddar batteri



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow