C# Language
Wielopostaciowość
Szukaj…
Kolejny przykład polimorfizmu
Polimorfizm jest jednym z filarów OOP. Poli pochodzi od greckiego terminu, który oznacza „wiele form”.
Poniżej znajduje się przykład, który wykazuje polimorfizm. Klasa Vehicle
przyjmuje wiele postaci jako klasę podstawową.
Klasy pochodne Ducati
i Lamborghini
dziedziczą z Vehicle
i zastępują metodę Display()
klasy podstawowej, aby wyświetlić własne 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}");
}
}
Poniżej znajduje się fragment kodu, w którym eksponowany jest polimorfizm. Obiekt jest tworzony dla typu podstawowego Vehicle
za pomocą vehicle
zmiennego w linii 1. W linii 2 wywołuje metodę klasy bazowej Display()
i wyświetla dane wyjściowe, jak pokazano.
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
}
W linii 3 obiekt vehicle
jest wskazywany na pochodną klasę Ducati
i wywołuje metodę Display()
, która wyświetla dane wyjściowe, jak pokazano. Oto zachowanie polimorficzne, mimo że obiekt vehicle
jest typu Vehicle
, wywołuje metodę klasy pochodnej Display()
ponieważ typ Ducati
przesłania metodę klasy Display()
, ponieważ obiekt vehicle
jest skierowany w stronę Ducati
.
To samo wyjaśnienie ma zastosowanie, gdy wywołuje metodę Display()
typu Lamborghini
.
Dane wyjściowe pokazano poniżej
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
Rodzaje polimorfizmu
Polimorfizm oznacza, że operację można również zastosować do wartości niektórych innych typów.
Istnieje wiele rodzajów polimorfizmu:
- Polimorfizm ad hoc:
zawierafunction overloading
. Celem jest to, że Metodę można stosować z różnymi typami bez potrzeby jej ogólnego charakteru. - Polimorfizm parametryczny:
jest użycie typów ogólnych. Zobacz ogólne - Subtyping:
ma dziedziczenie celu klasy w celu uogólnienia podobnej funkcjonalności
Polimorfizm ad hoc
Celem Ad hoc polymorphism
jest stworzenie metody, która może być wywoływana przez różne typy danych bez potrzeby konwersji typu w wywołaniu funkcji lub ogólnych. Następujące metody sumInt(par1, par2)
mogą być wywoływane z różnymi typami danych i dla każdej kombinacji typów mają własną implementację:
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);
}
Oto przykładowe połączenie:
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
}
Subtyping
Subtyping to użycie dziedziczenia z klasy podstawowej w celu uogólnienia podobnego zachowania:
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");
}
}
Obie klasy NormalCar
i ElectricCar
mają teraz metodę tankowania, ale mają własną implementację. Oto przykład:
public static void Main()
{
List<Car> cars = new List<Car>(){
new NormalCar(),
new ElectricCar()
};
cars.ForEach(x => x.refuel());
}
Dane wyjściowe będą następujące:
Tankowanie benzyny
Ładowanie baterii