Konstruktor

Co to jest konstruktor?

Konstruktor to specjalna metoda w klasie, która jest wywoływana automatycznie, kiedy tworzony jest nowy obiekt tej klasy. Służy do inicjalizacji obiektu, czyli ustawiania wartości początkowych dla pól (właściwości) tego obiektu.

  • Konstruktor ma taką samą nazwę jak klasa i nie posiada typu zwracanego (nawet void).
  • Używany jest do nadania wartości początkowych właściwościom obiektu lub wykonania innych operacji podczas tworzenia obiektu.

Przykład prostego konstruktora:

public class Samochod
{
    public string Marka;
    public string Model;

    // Konstruktor klasy Samochod
    public Samochod()
    {
        marka = "Nieznana";
        model = "Nieznany";
    }

    public void WypiszInformacje()
    {
        Console.WriteLine("Marka: " + Marka + ", Model: " + Model);
    }
}

// Tworzenie obiektu klasy Samochod
Samochod auto = new Samochod();
auto.WypiszInformacje();  // Wypisze: Marka: Nieznana, Model: Nieznany

Konstruktor Samochod() inicjalizuje pola Marka i Model domyślnymi wartościami: „Nieznana” i „Nieznany”.

Po utworzeniu obiektu auto wywołujemy metodę WypiszInformacje, aby wypisać wartości przypisane przez konstruktor.

Rodzaje konstruktorów

Konstruktor domyślny

Konstruktor domyślny to konstruktor bez parametrów, który jest wywoływany automatycznie, jeśli nie zdefiniujemy żadnego własnego konstruktora. Jeśli programista nie napisze własnego konstruktora, C# automatycznie tworzy domyślny konstruktor (bez parametrów), który nie wykonuje żadnych operacji.

Przykład konstruktora domyślnego:

public class Pies
{
    public string imie = "Reksio";
    public int Wiek = 5;
}

Pies mojPies = new Pies();
Console.WriteLine(mojPies.Imie);  // Wypisze: Reksio
Console.WriteLine(mojPies.Wiek);  // Wypisze: 5

Klasa Pies nie ma jawnie zdefiniowanego konstruktora, więc kompilator automatycznie tworzy domyślny konstruktor. Tworząc obiekt Pies, pola są inicjalizowane wartościami domyślnymi, które zostały zdefiniowane w deklaracjach.

Konstruktor parametryzowany

Konstruktor parametryzowany przyjmuje argumenty, które są przekazywane podczas tworzenia obiektu. Dzięki temu można inicjalizować obiekt wartościami przekazanymi przez użytkownika.

Przykład konstruktora parametryzowanego:

public class Samochod
{
    public string Marka;
    public string Model;

    // Konstruktor z parametrami
    public Samochod(string marka, string model)
    {
        Marka = marka;
        Model = model;
    }

    public void WypiszInformacje()
    {
        Console.WriteLine("Marka: " + Marka + ", Model: " + Model);
    }
}

// Tworzenie obiektu klasy Samochod z parametrami
Samochod auto = new Samochod("Toyota", "Corolla");
auto.WypiszInformacje();  // Wypisze: Marka: Toyota, Model: Corolla

Konstruktor Samochod(string marka, string model) przyjmuje dwa parametry i przypisuje je do pól Marka i Model.

Podczas tworzenia obiektu Samochod, przekazujemy wartości "Toyota" i "Corolla", które są używane do inicjalizacji.

Konstruktor kopiujący

Konstruktor kopiujący tworzy nowy obiekt jako kopię istniejącego obiektu tej samej klasy. Taki konstruktor jest przydatny, gdy chcemy utworzyć nowy obiekt z wartościami już istniejącego obiektu.

Przykład konstruktora kopiującego:

public class Samochod
{
    public string Marka;
    public string Model;

    // Konstruktor kopiujący
    public Samochod(Samochod innySamochod)
    {
        Marka = innySamochod.Marka;
        Model = innySamochod.Model;
    }

    public void WypiszInformacje()
    {
        Console.WriteLine("Marka: " + Marka + ", Model: " + Model);
    }
}

// Tworzenie obiektu klasy Samochod
Samochod auto1 = new Samochod();
auto1.Marka = "Ford";
auto1.Model = "Focus";

// Tworzenie kopii obiektu
Samochod auto2 = new Samochod(auto1);
auto2.WypiszInformacje();  // Wypisze: Marka: Ford, Model: Focus

Konstruktor kopiujący Samochod(Samochod innySamochod) inicjalizuje nowy obiekt, kopiując wartości z innego obiektu.

Obiekt auto2 jest kopią obiektu auto1.

Dziedziczenie konstruktorów

W C# klasy mogą dziedziczyć po innych klasach, co oznacza, że klasa pochodna (dziedzicząca) ma dostęp do właściwości i metod klasy bazowej (tej, po której dziedziczy). Dziedziczenie dotyczy również konstruktorów.

a) Wywołanie konstruktora klasy bazowej za pomocą słowa kluczowego base

Kiedy tworzymy obiekt klasy pochodnej, konstruktor klasy pochodnej może wywołać konstruktor klasy bazowej, aby zainicjalizować część obiektu dziedziczoną po klasie bazowej. Do tego służy słowo kluczowe base.

Przykład dziedziczenia konstruktorów:

public class Pojazd
{
    public string Marka;

    // Konstruktor klasy bazowej
    public Pojazd(string marka)
    {
        Marka = marka;
        Console.WriteLine("Konstruktor klasy Pojazd");
    }
}

public class Samochod : Pojazd
{
    public string Model;

    // Konstruktor klasy pochodnej
    public Samochod(string marka, string model) : base(marka)  // Wywołanie konstruktora klasy bazowej
    {
        Model = model;
        Console.WriteLine("Konstruktor klasy Samochod");
    }

    public void WypiszInformacje()
    {
        Console.WriteLine("Marka: " + Marka + ", Model: " + Model);
    }
}

// Tworzenie obiektu klasy Samochod
Samochod auto = new Samochod("Toyota", "Corolla");
auto.WypiszInformacje();  // Wypisze: Marka: Toyota, Model: Corolla

Klasa Samochod dziedziczy po klasie Pojazd.

Konstruktor klasy Samochod wywołuje konstruktor klasy Pojazd za pomocą słowa kluczowego base, przekazując do niego argument marka.

Kiedy tworzymy obiekt klasy Samochod, najpierw wywoływany jest konstruktor klasy bazowej Pojazd, a następnie konstruktor klasy Samochod.

Konstruktor statyczny

Konstruktor statyczny służy do inicjalizacji statycznych pól klasy. Jest wywoływany tylko raz, przy pierwszym dostępie do statycznych elementów klasy. Konstruktor statyczny nie może przyjmować parametrów.

Przykład konstruktora statycznego:

public class Kalkulator
{
    public static double Pi;

    // Konstruktor statyczny
    static Kalkulator()
    {
        Pi = 3.14159;
    }

    public static double ObliczPoleKola(double promien)
    {
        return Pi * promien * promien;
    }
}

double pole = Kalkulator.ObliczPoleKola(5);
Console.WriteLine(pole);  // Wypisze: 78.53975

Konstruktor statyczny Kalkulator() inicjalizuje wartość pola statycznego Pi.

Jest wywoływany tylko raz, przy pierwszym użyciu klasy Kalkulator.

Podsumowanie konstruktorów w C#

Rodzaj konstruktoraOpisPrzykład
Konstruktor domyślnyBez parametrów, tworzony automatycznie, jeśli brak innychpublic Samochod() {}
Konstruktor parametryzowanyPrzyjmuje argumenty do inicjalizacji pólpublic Samochod(string marka, string model) {}
Konstruktor kopiującyTworzy kopię istniejącego obiektupublic Samochod(Samochod innySamochod) {}
Konstruktor statycznyInicjalizuje statyczne pola, wywoływany tylko razstatic Kalkulator() {}
Dziedziczenie konstruktorówKonstruktor klasy pochodnej wywołuje konstruktor klasy bazowej: base(marka)