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.
Wyzwanie
ŁatwyZbudujmy 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ęProductw przestrzeni nazwInventory, 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żej0— jeśli ktoś spróbuje ustawić ujemną cenę, powinna zostać zapisana jako0 - Prywatne pole
quantity(int) oraz publiczną właściwośćQuantity, która utrzymuje wartości w zakresie od0do1000— 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 zwracaPrice * Quantity
- Prywatne pole
Program.cs: W pliku głównym utwórz obiektProductna 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=0Zauważ, ż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}
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online