Propriétés pour l'encapsulation
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 32 sur 70.
Les propriétés sont l’outil principal pour mettre en œuvre l’encapsulation en C#. Au lieu d’exposer directement les champs, vous les encapsulez dans des propriétés qui contrôlent la manière dont les données sont consultées et modifiées.
Le modèle associe un champ privé à une propriété publique qui inclut une validation ou une logique dans ses accesseurs :
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15; // Minimum du zéro absolu
else
celsius = value;
}
}
}Désormais, le code externe ne peut pas définir une température impossible. La propriété joue le rôle de gardienne, en veillant à ce que ton objet reste toujours dans un état valide. C’est l’encapsulation en action : les données internes sont protégées tout en restant accessibles par une interface contrôlée.
Tu peux aussi utiliser des propriétés pour calculer des valeurs ou déclencher des effets secondaires :
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}Le monde extérieur voit deux propriétés, mais, en interne, il n’y a qu’un seul champ. Les propriétés te permettent de modifier les détails de l’implémentation sans casser le code qui utilise ta classe — un avantage clé d’une bonne encapsulation.
Défi
FacileCréons un système d’inventaire de produits qui utilise des propriétés pour protéger l’intégrité des données. Tu vas créer une classe où les prix ne peuvent jamais être négatifs et où les quantités restent toujours dans des limites valides — une démonstration de la façon dont les propriétés servent de gardiennes de tes données.
Tu vas organiser ton code dans deux fichiers :
Product.cs: crée une classeProductdans l’espace de nomsInventoryqui gère les informations sur les produits en validant les données au moyen de propriétés. Ton produit a besoin des éléments suivants :- Un champ privé
price(décimal) avec une propriété publiquePricequi garantit que le prix ne descend jamais en dessous de0: si quelqu’un essaie de définir un prix négatif, la valeur enregistrée doit être0 - Un champ privé
quantity(entier) avec une propriété publiqueQuantityqui maintient les valeurs entre0et1000: les valeurs inférieures à 0 deviennent 0, et les valeurs supérieures à 1000 deviennent 1000 - Une propriété publique auto-implémentée
Name(chaîne de caractères) - Une propriété calculée en lecture seule
TotalValuequi renvoiePrice * Quantity
- Un champ privé
Program.cs: dans ton fichier principal, crée unProductà partir des valeurs saisies. Essaie ensuite de modifier le prix et la quantité à l’aide de valeurs supplémentaires qui pourraient être invalides. Affiche l’état du produit après sa création, puis après chaque modification, pour voir comment les propriétés protègent les données.
Tu recevras cinq entrées :
- Nom du produit
- Prix initial (décimal)
- Quantité initiale (entier)
- Nouveau prix à définir (décimal, qui peut être négatif)
- Nouvelle quantité à définir (entier, qui peut être hors limites)
Affiche le résultat dans ce format :
After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}Par exemple, si les entrées sont Laptop, 999.99, 50, -100 et 1500, le résultat devrait être :
After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0Remarque que le prix négatif est devenu 0 et que la quantité de 1500 a été limitée à 1000. Tes propriétés protègent l’objet contre les états invalides : c’est l’encapsulation en action !
Essayez vous-même
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Lire les entrées
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: Créer un Product avec les valeurs initiales
// TODO: Afficher l’état du produit après sa création
Console.WriteLine("After creation:");
// Format d’affichage : {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Modifier le prix et la quantité avec les nouvelles valeurs
// TODO: Afficher l’état du produit après les modifications
Console.WriteLine("After modifications:");
// Format d’affichage : {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne