Eigenschaften zur Kapselung
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 32 von 70.
Eigenschaften sind das wichtigste Mittel zur Implementierung von Kapselung in C#. Anstatt Felder direkt zugänglich zu machen, 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 in ihren Zugriffsmethoden eine Validierung oder Logik enthält:
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15; // Minimum: absoluter Nullpunkt
else
celsius = value;
}
}
}Jetzt kann externer Code keine unmögliche Temperatur mehr festlegen. Die Eigenschaft fungiert als Wächter und stellt sicher, dass dein Objekt immer in einem gültigen Zustand bleibt. Das ist Kapselung in Aktion – die internen Daten sind geschützt und bleiben dennoch über eine kontrollierte Schnittstelle zugänglich.
Du kannst Eigenschaften auch verwenden, um Werte zu berechnen oder Nebenwirkungen auszulösen:
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}Die Außenwelt sieht zwei Eigenschaften, intern gibt es jedoch nur ein Feld. Eigenschaften ermöglichen es dir, Implementierungsdetails zu ändern, ohne den Code zu beschädigen, der deine Klasse verwendet – ein entscheidender Vorteil der richtigen Kapselung.
Aufgabe
EinfachErstellen wir ein Produktinventarsystem, das Eigenschaften verwendet, um die Datenintegrität zu schützen. Du erstellst eine Klasse, in der Preise niemals negativ sein können und Mengen immer innerhalb gültiger Grenzen gehalten werden – damit wird gezeigt, wie Eigenschaften als Wächter für deine Daten fungieren.
Du organisierst deinen Code auf zwei Dateien:
Product.cs: Erstelle eineProduct-Klasse im NamespaceInventory, die Produktinformationen verwaltet und mithilfe von Eigenschaften validiert. Dein Produkt benötigt:- Ein privates Feld
price(decimal) mit einer öffentlichen EigenschaftPrice, die sicherstellt, dass der Preis niemals unter0fällt – versucht jemand, einen negativen Preis festzulegen, soll stattdessen0gespeichert werden - Ein privates Feld
quantity(int) mit einer öffentlichen EigenschaftQuantity, 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 anhand von Eingabewerten einProduct. Versuche dann, den Preis und die Menge mithilfe zusätzlicher Eingabewerte zu ändern, die ungültig sein könnten. 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
- Anfangspreis (decimal)
- Anfangsmenge (Ganzzahl)
- Festzulegender neuer Preis (decimal, möglicherweise negativ)
- Festzulegende neue Menge (Ganzzahl, möglicherweise außerhalb des zulässigen Bereichs)
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 zum Beispiel Laptop, 999.99, 50, -100 und 1500 lauten, sollte die Ausgabe folgendermaßen 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 – das ist Kapselung in Aktion!
Probier es selbst
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Eingaben einlesen
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: Ein Product mit den Anfangswerten erstellen
// TODO: Den Zustand des Produkts nach der Erstellung ausgeben
Console.WriteLine("After creation:");
// Ausgabeformat: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Preis und Menge mit den neuen Werten ändern
// TODO: Den Zustand des Produkts nach den Änderungen ausgeben
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