1. Wprowadzenie do C#
  2. Szybki start
  3. Pierwszy program
  4. Komentarze
  5. Typy danych
  6. Zmienne
  7. Pola
  8. Właściwości
  9. Stałe
  10. Metody
  11. Instrukcje warunkowe
  12. Pętle
  13. Tablice
  14. Kolekcje
  15. Klasy
  16. Dziedziczenie
  17. Polimorfizm
  18. Konwersja typów
  19. Właściwości klasy String
  20. Typy wyliczeniowe
  21. Interfejsy
  22. Klasy statyczne
  23. Klasy Abstrakcyjne
  24. Przestrzenie nazw
  25. Wyjątki
  26. Typy generyczne
  27. JSON
  28. XML
  29. Podsumowanie

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;
    }
}
								
						
Wyjaśnienie

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);
    }
}
								
						
Wyjaśnienie

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.