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 konstruktora | Opis | Przykład |
---|---|---|
Konstruktor domyślny | Bez parametrów, tworzony automatycznie, jeśli brak innych | public Samochod() {} |
Konstruktor parametryzowany | Przyjmuje argumenty do inicjalizacji pól | public Samochod(string marka, string model) {} |
Konstruktor kopiujący | Tworzy kopię istniejącego obiektu | public Samochod(Samochod innySamochod) {} |
Konstruktor statyczny | Inicjalizuje statyczne pola, wywoływany tylko raz | static Kalkulator() {} |
Dziedziczenie konstruktorów | Konstruktor klasy pochodnej wywołuje konstruktor klasy bazowej | : base(marka) |