C# Language
polymorfism
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ållerfunction 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