Eigenschaften zur Kapselung
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 32 von 70.
Eigenschaften sind das wichtigste Werkzeug zur Implementierung der Kapselung in C#. Anstatt Felder direkt offenzulegen, umschließt du sie mit Eigenschaften, die steuern, wie auf Daten zugegriffen wird und wie sie geändert werden.
Das Muster kombiniert ein privates Feld mit einer öffentlichen Eigenschaft, die Validierung oder Logik in ihren Accessoren enthält:
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15; // Minimum am absoluten Nullpunkt
else
celsius = value;
}
}
}Jetzt kann externer Code keine unmögliche Temperatur festlegen. Die Eigenschaft fungiert als Gatekeeper und stellt sicher, dass Ihr Objekt immer in einem gültigen Zustand bleibt. Dies ist Kapselung in Aktion – die internen Daten sind geschützt, während sie dennoch über eine kontrollierte Schnittstelle zugänglich bleiben.
Sie können Eigenschaften auch verwenden, um Werte zu berechnen oder Seiteneffekte auszulösen:
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}Die Außenwelt sieht zwei Eigenschaften, aber intern gibt es nur ein Feld. Eigenschaften ermöglichen es dir, Implementierungsdetails zu ändern, ohne Code zu beschädigen, der deine Klasse verwendet – ein wesentlicher Vorteil einer guten Kapselung.
Aufgabe
EinfachLass uns ein Produktinventarsystem erstellen, das Eigenschaften verwendet, um die Datenintegrität zu schützen. Du erstellst eine Klasse, in der Preise niemals negativ werden können und Mengen immer innerhalb gültiger Grenzen bleiben – und demonstrierst damit, wie Eigenschaften als Schutzmechanismen für deine Daten fungieren.
Du wirst deinen Code auf zwei Dateien aufteilen:
Product.cs: Erstelle eineProduct-Klasse imInventory-Namespace, die Produktinformationen mit Validierung durch Eigenschaften verwaltet. Dein Produkt benötigt:- Ein privates Feld
price(decimal) mit einer öffentlichenPrice-Eigenschaft, die sicherstellt, dass der Preis niemals unter0fällt – wenn jemand versucht, einen negativen Preis festzulegen, soll stattdessen0gespeichert werden - Ein privates Feld
quantity(int) mit einer öffentlichenQuantity-Eigenschaft, die Werte zwischen0und1000hält – Werte unter 0 werden zu 0, Werte über 1000 werden zu 1000 - Eine öffentliche automatisch implementierte Eigenschaft
Name(string) - Eine berechnete schreibgeschützte Eigenschaft
TotalValue, diePrice * Quantityzurückgibt
- Ein privates Feld
Program.cs: Erstelle in deiner Hauptdatei einProduct-Objekt mithilfe von Eingabewerten. Versuche anschließend, den Preis und die Menge mit zusätzlichen Eingabewerten zu ändern, die möglicherweise ungültig sind. Gib den Zustand des Produkts nach der Erstellung und nach jeder Änderung aus, um zu sehen, wie die Eigenschaften die Daten schützen.
Du erhältst fünf Eingaben:
- Produktname
- Anfänglicher Preis (decimal)
- Anfängliche Menge (integer)
- Neuer festzulegender Preis (decimal, kann negativ sein)
- Neu festzulegende Menge (integer, kann außerhalb des gültigen Bereichs liegen)
Gib die Ausgabe in diesem Format aus:
After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}Wenn die Eingaben beispielsweise Laptop, 999.99, 50, -100 und 1500 lauten, sollte die Ausgabe wie folgt aussehen:
After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0Beachte, wie der negative Preis zu 0 wurde und die Menge von 1500 auf 1000 begrenzt wurde. Deine Eigenschaften schützen das Objekt vor ungültigen Zuständen – hier zeigt sich Kapselung in der Praxis!
Probier es selbst
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
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: Erstellen Sie ein Produkt mit den Anfangswerten
// TODO: Geben Sie den Produktzustand nach der Erstellung aus
Console.WriteLine("After creation:");
// Ausgabeformat: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Ändern Sie den Preis und die Menge mit den neuen Werten
// TODO: Geben Sie den Produktzustand nach den Änderungen aus
Console.WriteLine("After modifications:");
// Ausgabeformat: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler