Polimorfizm statyczny
Polimorfizm statyczny, inaczej zwany "compile-time polymorphism" lub "overloading" polega na możliwości istnienia kilku metod o tej samej nazwie, ale różniących się liczbą lub typem argumentów. Czyli, metoda przyjmuje różne argumenty i wykonuje różne operacje w zależności od tego, jaki zestaw argumentów został przekazany.
Polimorfizm jest realizowany za pomocą metod wirtualnych i przesłaniania metod. Metoda wirtualna pozwala na redefiniowanie jej w klasie pochodnej, natomiast przesłanianie metod pozwala na nadpisanie implementacji metody w klasie pochodnej.
using System;
class Program
{
static void Main(string[] args)
{
int wynik = Kalkulator.Dodaj(1, 2); // 1 + 2 = 3
double wynik1 = Kalkulator.Dodaj(1.0, 4.5); // 1 + 4.5 = 5.5
Console.WriteLine(wynik + wynik1); // 5.5 + 3 = 8.5
}
class Kalkulator
{
public static int Dodaj(int a, int b)
{
return a + b;
}
public static double Dodaj(double a, double b)
{
return a + b;
}
}
}
Przeciążenie Metod
Przeciążanie metod to specyficzna forma polimorfizmu statycznego, która polega na możliwości stworzenia kilku metod o tej samej nazwie, ale różniących się liczbą, typem lub kolejnością argumentów. Dzięki temu możliwe jest wywołanie odpowiedniej implementacji metody na podstawie argumentów, które zostaną przekazane.
class Matematyka
{
// Metoda Dodaj dla typu int
public int Dodaj(int a, int b)
{
return a + b;
}
// Metoda Dodaj dla typu double
public double Dodaj(double a, double b)
{
return a + b;
}
// Metoda Dodaj dla typu decimal
public decimal Dodaj(decimal a, decimal b)
{
return a + b;
}
}
W tym przykładzie mamy trzy metody o nazwie Dodaj, które przyjmują różne typy argumentów (int, double, decimal) i zwracają różne typy wyników. Dzięki temu, program może wybrać odpowiednią metodę Dodaj na podstawie argumentów przekazanych do metody.
Przeciążenie Operatorów
Przeciążanie operatorów polega na możliwości nadania nowego znaczenia standardowym operatorom, takim jak +, -, * itp. dla konkretnej klasy lub struktury. Dzięki temu, operator może wykonywać inną operację niż jego standardowe znaczenie dla danego typu danych.
class Vektor
{
public double X { get; set; }
public double Y { get; set; }
// Konstruktor klasy Vektor
public Vektor(double x, double y)
{
X = x;
Y = y;
}
// Przeciążenie operatora dodawania
public static Vektor operator +(Vektor a, Vektor b)
{
// Tworzenie nowego obiektu Vektor zsumowanych współrzędnych
return new Vektor(a.X + b.X, a.Y + b.Y);
}
// Przeciążenie operatora odejmowania
public static Vektor operator -(Vektor a, Vektor b)
{
// Tworzenie nowego obiektu Vektor z różnicy współrzędnych
return new Vektor(a.X - b.X, a.Y - b.Y);
}
}
W tym przykładzie, klasa Vektor posiada dwa właściwości X i Y oraz przeciążone operatory + i -, które pozwalają na dodawanie oraz odejmowanie dwóch obiektów klasy Vektor jakby były to wektory w przestrzeni.