INF.04 · C# · lekcja 11

Pola, metody i hermetyzacja (enkapsulacja)

Obiekt pilnuje swojego stanu

  • Zrozum
  • Sprawdź
  • Napisz sam

Po tej lekcji: obiekt pilnuje swojego stanu

Dzisiaj zrobisz konkretną rzecz

Hermetyzacja to jedna z czterech głównych zasad programowania obiektowego (obok dziedziczenia, polimorfizmu i abstrakcji) i pierwsza linia obrony przed błędami — klasa sama pilnuje, żeby jej dane zawsze były w poprawnym, sensownym stanie, niezależnie od tego, kto i jak jej używa.

Bankomat nie pozwala Ci bezpośrednio "wpisać" nowego salda na swoim koncie — możesz je zmienić TYLKO przez konkretne, kontrolowane operacje (wpłata, wypłata), z których każda ma swoje zasady. To dokładnie hermetyzacja w praktyce.

Sprawdź w działaniu

Obiekt pilnuje swojego stanu

Najpierw przewidź wynik. Zmień dane w modelu i porównaj efekt. Spróbuj także przypadku granicznego, a nie tylko pierwszego poprawnego przykładu.

Ta interakcja wymaga włączonego JavaScriptu.

Model pokazuje wybraną zasadę. Nie uruchamia ani nie ocenia wklejonego kodu C#.

1. Przygotuj i uruchom własny projekt

2. Najpierw mały przykład

Wykonaj tę próbę przed dłuższym rozwiązaniem. public pozwala odczytać Saldo, private set blokuje bezpośrednie ustawienie spoza klasy. Zmiana odbywa się przez metodę Wplac, która sprawdza regułę przed zmianą danych.

Program.cscsharp
var konto = new Konto();
konto.Wplac(50);
Console.WriteLine(konto.Saldo);

class Konto
{
    public decimal Saldo { get; private set; }
    public void Wplac(decimal kwota)
    {
        if (kwota <= 0) throw new ArgumentException("Kwota musi być dodatnia.");
        Saldo += kwota;
    }
}
Wynik
50. Próba konto.Saldo = -10 poza klasą nie skompiluje się.
  1. Co sprawdzić? Zmień jedną wartość i przed uruchomieniem zapisz przewidywany rezultat. Porównaj go z opisem wyniku; przy błędzie wróć do konkretnej instrukcji.

Jak to działa — 1

W Lekcji 10 wszystkie pola klasy Film były public — dostępne i modyfikowalne z ZEWNĄTRZ klasy, bez żadnej kontroli. To działa w prostych przykładach, ale w praktyce jest ryzykowne: ktokolwiek może przypisać polu Cena wartość ujemną, co nie ma sensu.

Hermetyzacja (enkapsulacja) to zasada UKRYWANIA wewnętrznych danych obiektu i udostępniania do nich kontrolowanego dostępu — zamiast pozwalać na dowolną, niekontrolowaną zmianę pola, klasa sama decyduje, jakie wartości są dozwolone.

Modyfikatory dostępu: public — dostępne z dowolnego miejsca w programie. private — dostępne TYLKO wewnątrz tej samej klasy (domyślny modyfikator pól, jeśli nic nie wpiszesz). protected — dostępne w tej klasie i w klasach po niej dziedziczących (Lekcja 13).

Właściwości (properties) to standardowy w C# sposób kontrolowanego udostępniania prywatnych pól — wyglądają jak pola z zewnątrz, ale w środku mogą mieć logikę: private double cena; public double Cena { get { return cena; } set { if (value >= 0) cena = value; } } get określa, co zwrócić przy ODCZYCIE, set określa, co zrobić przy PRZYPISANIU nowej wartości (value to nazwa niosąca przypisywaną wartość) — tutaj blokuje ustawienie ceny ujemnej.

Jak to działa — 2

Współczesny C# pozwala też na skrócony zapis prostych właściwości bez dodatkowej logiki: public string Tytul { get; set; } — tzw. auto-property, wygodna, gdy nie potrzebujesz żadnej walidacji.

3. Pełny przykład — czytaj od Main

Teraz zastąp Program.cs tym programem. Zanim uruchomisz, znajdź dane wejściowe, operację i miejsce prezentacji wyniku. W tym wariancie zachowujemy jawny Main. Nie wklejaj kilku pełnych programów do jednego pliku.

Program.cs — osobne uruchomieniecsharp
using System;

class KontoBankowe
{
    private double saldo; // prywatne pole - niedostępne bezpośrednio z zewnątrz

    public double Saldo
    {
        get { return saldo; }
        private set { saldo = value; } // ustawiać saldo można tylko wewnątrz klasy
    }

    public void Wplac(double kwota)
    {
        if (kwota > 0)
        {
            Saldo += kwota;
            Console.WriteLine("Wpłacono " + kwota + " zł. Saldo: " + Saldo + " zł");
        }
    }

    public void Wyplac(double kwota)
    {
        if (kwota > 0 && kwota <= Saldo)
        {
            Saldo -= kwota;
            Console.WriteLine("Wypłacono " + kwota + " zł. Saldo: " + Saldo + " zł");
        }
        else
        {
            Console.WriteLine("Nie można wypłacić - brak wystarczających środków.");
        }
    }
}

class Program
{
    static void Main()
    {
        KontoBankowe konto = new KontoBankowe();
        konto.Wplac(100);
        konto.Wyplac(30);
        konto.Wyplac(1000); // odrzucone - za mało środków

        // konto.saldo = -50; // BŁĄD KOMPILACJI - pole "saldo" jest prywatne
    }
}
  1. Prześledź kod Pole saldo jest private — nikt spoza klasy KontoBankowe nie może go odczytać ani zmienić bezpośrednio. Właściwość Saldo udostępnia ODCZYT publicznie (get), ale ZAPIS tylko wewnątrz klasy (private set) — dzięki temu jedynym sposobem zmiany salda z zewnątrz są metody Wplac() i Wyplac(), które PILNUJĄ poprawności operacji (kwota dodatnia, wystarczające środki).

Sprawdź, zanim przepiszesz cały program

Częsty błąd to uczynienie WSZYSTKICH pól klasy public "dla wygody", co całkowicie eliminuje korzyści hermetyzacji — jeśli dane w ogóle mają być chronione, muszą być private z kontrolowanym dostępem przez właściwości/metody. Drugi błąd: właściwość z pustym, bezużytecznym set, który nic nie waliduje — wtedy równie dobrze pole mogłoby być public. Trzeci: próba dostępu do prywatnego pola z zewnątrz klasy, co zawsze kończy się błędem kompilacji ("inaccessibility level").

Ćwiczenie z pomocą · samodzielna praca

4. Teraz Twoja zmiana

Dodaj do klasy KontoBankowe właściwość tylko do odczytu NumerKonta (ustawianą raz, np. w momencie utworzenia obiektu).

Oczekiwany rezultat
Spełnij warunki polecenia. Zapisz wejście, otrzymany wynik i wyjaśnij, która część kodu za niego odpowiada.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

Wróć do podstawowej formy oraz objaśnienia: public pozwala odczytać Saldo, private set blokuje bezpośrednie ustawienie spoza klasy. Zmiana odbywa się przez metodę Wplac, która sprawdza regułę przed zmianą danych.

Krok 2 — pokaż podpowiedź

Zmień tylko część potrzebną do polecenia. Zachowaj działającą wersję przed zmianą i uruchamiaj po każdym małym etapie.

Krok 3 — pokaż podpowiedź

Sprawdź przypadek zwykły i graniczny; porównaj z regułą: 50. Próba konto.Saldo = -10 poza klasą nie skompiluje się.

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

5. Sprawdź rozumienie, nie tylko uruchomienie

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka