Proprietà per l'incapsulamento
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 32 di 70.
Le proprietà sono lo strumento principale per implementare l'incapsulamento in C#. Invece di esporre direttamente i campi, li racchiudi in proprietà che controllano il modo in cui i dati vengono consultati e modificati.
Lo schema combina un campo privato con una proprietà pubblica che include una convalida o una logica nei relativi accessori:
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15; // Minimo dello zero assoluto
else
celsius = value;
}
}
}Ora il codice esterno non può impostare una temperatura impossibile. La proprietà funge da guardiano, assicurando che il tuo oggetto rimanga sempre in uno stato valido. Questo è l’incapsulamento in azione: i dati interni sono protetti, ma restano accessibili tramite un’interfaccia controllata.
Puoi anche usare le proprietà per calcolare valori o attivare effetti collaterali:
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}Il mondo esterno vede due proprietà, ma internamente c’è un solo campo. Le proprietà ti permettono di modificare i dettagli di implementazione senza compromettere il codice che usa la tua classe: un vantaggio fondamentale di un corretto incapsulamento.
Sfida
FacileCostruiamo un sistema di inventario dei prodotti che usa le proprietà per proteggere l'integrità dei dati. Creerai una classe in cui i prezzi non possono mai diventare negativi e le quantità vengono sempre mantenute entro limiti validi: in questo modo vedrai come le proprietà fungono da custodi dei tuoi dati.
Organizzerai il codice in due file:
Product.cs: crea una classeProductnello spazio dei nomiInventoryche gestisce le informazioni sui prodotti con la convalida tramite proprietà. Il prodotto deve avere:- Un campo privato
price(decimal) con una proprietà pubblicaPriceche garantisce che il prezzo non scenda mai sotto0: se qualcuno prova a impostare un prezzo negativo, al suo posto deve essere memorizzato0 - Un campo privato
quantity(int) con una proprietà pubblicaQuantityche mantiene i valori tra0e1000: i valori inferiori a 0 diventano 0, quelli superiori a 1000 diventano 1000 - Una proprietà pubblica automatica
Name(string) - Una proprietà di sola lettura calcolata
TotalValueche restituiscePrice * Quantity
- Un campo privato
Program.cs: nel file principale, crea unProductusando i valori di input. Poi prova a modificare il prezzo e la quantità con ulteriori valori di input, che potrebbero non essere validi. Stampa lo stato del prodotto dopo la creazione e dopo ogni modifica, per vedere come le proprietà proteggono i dati.
Riceverai cinque input:
- Nome del prodotto
- Prezzo iniziale (decimal)
- Quantità iniziale (intero)
- Nuovo prezzo da impostare (decimal, potrebbe essere negativo)
- Nuova quantità da impostare (intero, potrebbe essere fuori dall'intervallo consentito)
Stampa l'output in questo formato:
After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}Per esempio, se gli input sono Laptop, 999.99, 50, -100 e 1500, l'output dovrebbe essere:
After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0Nota come il prezzo negativo è diventato 0 e la quantità di 1500 è stata limitata a 1000. Le tue proprietà proteggono l'oggetto dagli stati non validi: questa è l'incapsulazione in azione!
Provalo tu
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Leggi i dati di input
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: Crea un Product usando i valori iniziali
// TODO: Stampa lo stato del prodotto dopo la creazione
Console.WriteLine("After creation:");
// Formato di stampa: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Modifica il prezzo e la quantità con i nuovi valori
// TODO: Stampa lo stato del prodotto dopo le modifiche
Console.WriteLine("After modifications:");
// Formato di stampa: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online