Menu
Coddy logo textTech

Właściwości w hermetyzacji

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 32 z 70.

Właściwości to podstawowe narzędzie do implementowania enkapsulacji w C#. Zamiast udostępniać pola bezpośrednio, otaczasz je właściwościami, które kontrolują sposób dostępu do danych i ich modyfikowania.

Ten wzorzec łączy pole prywatne z właściwością publiczną, która zawiera walidację lub logikę w swoich akcesorach:

public class Temperature
{
    private double celsius;
    
    public double Celsius
    {
        get { return celsius; }
        set
        {
            if (value < -273.15)
                celsius = -273.15;  // Minimum to zero absolutne
            else
                celsius = value;
        }
    }
}

Teraz zewnętrzny kod nie może ustawić niemożliwej temperatury. Właściwość działa jak strażnik, dbając o to, by Twój obiekt zawsze pozostawał w prawidłowym stanie. To enkapsulacja w praktyce — dane wewnętrzne są chronione, a jednocześnie dostępne przez kontrolowany interfejs.

Możesz także używać właściwości do obliczania wartości lub wywoływania efektów ubocznych:

public double Fahrenheit
{
    get { return celsius * 9 / 5 + 32; }
    set { celsius = (value - 32) * 5 / 9; }
}

Świat zewnętrzny widzi dwie właściwości, ale wewnętrznie istnieje tylko jedno pole. Właściwości pozwalają zmieniać szczegóły implementacji bez psucia kodu, który korzysta z twojej klasy — to kluczowa zaleta właściwej enkapsulacji.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system inwentaryzacji produktów, który używa właściwości do ochrony integralności danych. Utworzysz klasę, w której ceny nigdy nie mogą być ujemne, a ilości zawsze mieszczą się w prawidłowym zakresie — pokażesz w ten sposób, jak właściwości pełnią funkcję strażników danych.

Uporządkujesz swój kod w dwóch plikach:

  • Product.cs: Utwórz klasę Product w przestrzeni nazw Inventory, która zarządza informacjami o produktach i sprawdza ich poprawność za pomocą właściwości. Produkt powinien mieć:
    • Prywatne pole price (decimal) oraz publiczną właściwość Price, która dopilnuje, by cena nigdy nie spadła poniżej 0 — jeśli ktoś spróbuje ustawić ujemną cenę, powinna zostać zapisana jako 0
    • Prywatne pole quantity (int) oraz publiczną właściwość Quantity, która utrzymuje wartości w zakresie od 0 do 1000 — wartości poniżej 0 zmieniają się na 0, a wartości powyżej 1000 na 1000
    • Publiczną, automatycznie implementowaną właściwość Name (string)
    • Obliczaną właściwość tylko do odczytu TotalValue, która zwraca Price * Quantity
    Dodaj konstruktor, który przyjmuje nazwę, cenę i ilość (w tej kolejności) oraz ustawia wszystkie wartości za pomocą właściwości, aby zastosować walidację.
  • Program.cs: W pliku głównym utwórz obiekt Product na podstawie wprowadzonych wartości. Następnie spróbuj zmienić cenę i ilość, używając dodatkowych wartości wejściowych, które mogą być nieprawidłowe. Wypisz stan produktu po utworzeniu i po każdej zmianie, aby zobaczyć, jak właściwości chronią dane.

Otrzymasz pięć danych wejściowych:

  • Nazwę produktu
  • Cenę początkową (decimal)
  • Początkową ilość (liczba całkowita)
  • Nową cenę do ustawienia (decimal, może być ujemna)
  • Nową ilość do ustawienia (liczba całkowita, może być poza zakresem)

Wypisz wynik w tym formacie:

After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}

Na przykład, jeśli dane wejściowe to Laptop, 999.99, 50, -100 i 1500, wynik powinien wyglądać tak:

After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0

Zauważ, że ujemna cena zmieniła się na 0, a ilość 1500 została ograniczona do 1000. Twoje właściwości chronią obiekt przed nieprawidłowymi stanami — tak właśnie działa hermetyzacja!

Spróbuj swoich sił

using System;
using Inventory;

class Program
{
    public static void Main(string[] args)
    {
        // Wczytaj dane wejściowe
        string name = Console.ReadLine();
        decimal initialPrice = Convert.ToDecimal(Console.ReadLine());
        int initialQuantity = Convert.ToInt32(Console.ReadLine());
        decimal newPrice = Convert.ToDecimal(Console.ReadLine());
        int newQuantity = Convert.ToInt32(Console.ReadLine());

        // TODO: Utwórz Product, używając wartości początkowych
        
        // TODO: Wyświetl stan produktu po utworzeniu
        Console.WriteLine("After creation:");
        // Format wyświetlania: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
        
        // TODO: Zmień cenę i ilość na nowe wartości
        
        // TODO: Wyświetl stan produktu po zmianach
        Console.WriteLine("After modifications:");
        // Format wyświetlania: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online