Właściwości w hermetyzacji
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 32 z 70.
Właściwości są podstawowym narzędziem do implementowania enkapsulacji w C#. Zamiast udostępniać pola bezpośrednio, opakowujesz je właściwościami, które kontrolują sposób dostępu do danych i ich modyfikowania.
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 bezwzględne
else
celsius = value;
}
}
}Teraz kod zewnętrzny 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 za pośrednictwem kontrolowanego interfejsu.
Możesz również 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 korzystającego z Twojej klasy — to kluczowa zaleta prawidłowej enkapsulacji.
Wyzwanie
ŁatwyZbudujmy system ewidencji produktów, który wykorzystuje właściwości do ochrony integralności danych. Utworzysz klasę, w której ceny nigdy nie będą ujemne, a ilości zawsze będą mieścić się w prawidłowych zakresach — zademonstrujesz w ten sposób, jak właściwości pełnią funkcję strażników danych.
Uporządkujesz kod w dwóch plikach:
Product.cs: Utwórz klasęProductw przestrzeni nazwInventory, która zarządza informacjami o produkcie i sprawdza poprawność danych za pomocą właściwości. Produkt powinien mieć:- Prywatne pole
price(decimal) i publiczną właściwośćPrice, która gwarantuje, że cena nigdy nie będzie niższa niż0— jeśli ktoś spróbuje ustawić ujemną cenę, zamiast niej powinna zostać zapisana wartość0 - Prywatne pole
quantity(int) i publiczną właściwośćQuantity, która utrzymuje wartości w zakresie od0do1000— wartości poniżej 0 stają się równe 0, a wartości powyżej 1000 stają się równe 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 obiektProduct, używając wartości wejściowych. Następnie spróbuj zmodyfikować cenę i ilość za pomocą dodatkowych wartości wejściowych, które mogą być nieprawidłowe. Wyświetl stan produktu po utworzeniu oraz po każdej modyfikacji, aby zobaczyć, jak właściwości chronią dane.
Otrzymasz pięć danych wejściowych:
- Nazwa produktu
- Cena początkowa (decimal)
- Początkowa ilość (liczba całkowita)
- Nowa cena do ustawienia (decimal, może być ujemna)
- Nowa ilość do ustawienia (liczba całkowita, może być poza zakresem)
Wyświetl wynik w następującym 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=0Zwróć uwagę, że ujemna cena zmieniła się na 0, a ilość 1500 została ograniczona do 1000. Właściwości chronią obiekt przed nieprawidłowymi stanami — właśnie tak działa enkapsulacja!
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: Wypisz stan produktu po utworzeniu
Console.WriteLine("After creation:");
// Format wyjściowy: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Zmień cenę i ilość, używając nowych wartości
// TODO: Wypisz stan produktu po zmianach
Console.WriteLine("After modifications:");
// Format wyjściowy: {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