C# Klasse und Objekt: Bauplan und Produkt
Klasse und Objekt: der Moment, in dem es Klick macht
Beim Lernen von OOP war für mich der Anfang das Schwerste. Was ist eine Klasse, was ein Objekt, und worin liegt der Unterschied? Alle sagten „Eine Klasse ist ein Bauplan“, aber ich konnte damit wenig anfangen.
Bis es eines Tages beim Kuchenbacken in der Küche Klick machte: Die Klasse ist die Backform, die Objekte sind die Kuchen, die aus dieser Form kommen!
Die Analogie mit der Backform
Stellen Sie sich vor: Sie halten eine herzförmige Backform in der Hand.
- Form (Klasse): Legt fest, wie der Kuchen aussehen wird. Form und Größe stehen fest.
- Kuchen (Objekte): Die konkreten Produkte, die aus der Form kommen. Jedes ist ein eigener Kuchen.
Die Form können Sie nicht essen, die daraus entstandenen Kuchen schon. Aus derselben Form können Sie beliebig viele Kuchen backen, und jeder ist unabhängig von den anderen.
// This is a Class - The cake mold
public class Cake
{
public string Flavor { get; set; }
public string Color { get; set; }
public int Slices { get; set; }
}
// These are Objects - Cakes from the mold
Cake chocolateCake = new Cake();
chocolateCake.Flavor = "Chocolate";
chocolateCake.Color = "Brown";
chocolateCake.Slices = 8;
Cake bananaCake = new Cake();
bananaCake.Flavor = "Banana";
bananaCake.Color = "Yellow";
bananaCake.Slices = 6;chocolateCake und bananaCake stammen aus derselben Form (Klasse), sind aber völlig verschiedene Produkte (Objekte). Ein Stück vom einen zu essen wirkt sich nicht auf das andere aus.
Was ist eine Klasse?
Eine Klasse ist eine Vorlage, die festlegt, wie etwas beschaffen ist. Sie enthält:
- Eigenschaften (Properties): Die Merkmale dieser Sache. Farbe, Größe, Name usw.
- Methoden: Die Handlungen, die diese Sache ausführen kann. Starten, anhalten, berechnen usw.
public class Car
{
// Properties - Car's characteristics
public string Brand { get; set; }
public string Model { get; set; }
public string Color { get; set; }
public int Speed { get; set; }
public bool IsEngineRunning { get; set; }
// Methods - Car's behaviors
public void StartEngine()
{
IsEngineRunning = true;
Console.WriteLine($"{Brand} {Model} engine started!");
}
public void StopEngine()
{
IsEngineRunning = false;
Speed = 0;
Console.WriteLine($"{Brand} {Model} engine stopped.");
}
public void Accelerate(int amount)
{
if (IsEngineRunning)
{
Speed += amount;
Console.WriteLine($"{Brand} accelerated! Current speed: {Speed} km/h");
}
else
{
Console.WriteLine("You must start the engine first!");
}
}
}Diese Klasse Car tut für sich genommen nichts. Sie sagt lediglich: „So sieht ein Auto aus.“ Um echte Autos zu erzeugen, müssen wir Instanzen anlegen.
Was ist ein Objekt?
Ein Objekt ist eine konkrete Instanz, die aus einer Klasse erzeugt wurde. Jedes Objekt belegt eigenen Speicher und hält seine eigenen Werte.
// Creating instances (Objects)
Car myCar = new Car();
myCar.Brand = "Toyota";
myCar.Model = "Corolla";
myCar.Color = "White";
Car dadsCar = new Car();
dadsCar.Brand = "Ford";
dadsCar.Model = "Focus";
dadsCar.Color = "Blue";
// Each car operates independently
myCar.StartEngine();
myCar.Accelerate(50);
dadsCar.StartEngine();
dadsCar.Accelerate(30);
// Output:
// Toyota Corolla engine started!
// Toyota accelerated! Current speed: 50 km/h
// Ford Focus engine started!
// Ford accelerated! Current speed: 30 km/hWenn mein Auto beschleunigt, wirkt sich das nicht auf Papas Auto aus. Beide stammen aus derselben Klasse „Car“, sind nun aber unabhängige Objekte.
Property und Field: kleiner, aber wichtiger Unterschied
In C# gibt es zwei Begriffe: Field und Property. Anfangs werden sie verwechselt, doch der Unterschied zählt.
public class Student
{
// Field - Direct variable
public string name; // ❌ Not recommended
// Property - Controlled access with Get/Set
public string Name { get; set; } // ✅ Preferred
// Property with backing field - Full control
private int _age;
public int Age
{
get { return _age; }
set
{
if (value >= 0 && value <= 150)
_age = value;
else
Console.WriteLine("Invalid age!");
}
}
}Der Vorteil von Properties: Sie können beim Zuweisen oder Auslesen eines Werts prüfen. Im Beispiel oben lassen sich unsinnige Werte wie -5 oder 200 nicht als Alter setzen.
Methoden: die Fähigkeiten von Objekten
Eine Methode ist eine Handlung, die ein Objekt ausführen kann. Sie kann Parameter entgegennehmen und Werte zurückgeben.
public class Calculator
{
// Method with parameters
public int Add(int a, int b)
{
return a + b;
}
// Multiple parameters
public double Average(double x, double y, double z)
{
return (x + y + z) / 3;
}
// Method without parameters
public void Greet()
{
Console.WriteLine("Hello, calculator is ready!");
}
// void - Returns nothing
public void PrintResult(int result)
{
Console.WriteLine($"Result: {result}");
}
}
// Usage
Calculator calc = new Calculator();
calc.Greet();
int sum = calc.Add(5, 3);
calc.PrintResult(sum);
double avg = calc.Average(80, 90, 70);
Console.WriteLine($"Average: {avg}");Praxisbeispiel: ein Bibliothekssystem
Fügen wir alles Gelernte zusammen und entwerfen ein einfaches System zur Bibliotheksverwaltung:
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
public string ISBN { get; set; }
public int PageCount { get; set; }
public bool IsBorrowed { get; set; }
public void DisplayInfo()
{
Console.WriteLine($"📖 {Title}");
Console.WriteLine($" Author: {Author}");
Console.WriteLine($" ISBN: {ISBN}");
Console.WriteLine($" Pages: {PageCount}");
Console.WriteLine($" Status: {(IsBorrowed ? "Borrowed" : "Available")}");
}
}
public class Member
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MemberID { get; set; }
public List<Book> BorrowedBooks { get; set; }
public Member()
{
BorrowedBooks = new List<Book>();
}
public bool BorrowBook(Book book)
{
if (!book.IsBorrowed)
{
book.IsBorrowed = true;
BorrowedBooks.Add(book);
Console.WriteLine($"✅ {FirstName} {LastName} borrowed '{book.Title}'.");
return true;
}
Console.WriteLine($"❌ '{book.Title}' is currently borrowed.");
return false;
}
public void ReturnBook(Book book)
{
if (BorrowedBooks.Contains(book))
{
book.IsBorrowed = false;
BorrowedBooks.Remove(book);
Console.WriteLine($"📚 '{book.Title}' has been returned.");
}
}
public void ShowBorrowedList()
{
Console.WriteLine($"\nBooks borrowed by {FirstName} {LastName}:");
if (BorrowedBooks.Count == 0)
{
Console.WriteLine(" No borrowed books.");
return;
}
foreach (var book in BorrowedBooks)
{
Console.WriteLine($" - {book.Title}");
}
}
}Und nun verwenden wir diese Klassen:
// Create books
Book book1 = new Book
{
Title = "Crime and Punishment",
Author = "Fyodor Dostoevsky",
ISBN = "978-123-456",
PageCount = 671
};
Book book2 = new Book
{
Title = "1984",
Author = "George Orwell",
ISBN = "978-789-012",
PageCount = 352
};
// Create members
Member john = new Member
{
FirstName = "John",
LastName = "Smith",
MemberID = "M001"
};
Member emma = new Member
{
FirstName = "Emma",
LastName = "Johnson",
MemberID = "M002"
};
// Operations
book1.DisplayInfo();
Console.WriteLine();
john.BorrowBook(book1); // John borrows
emma.BorrowBook(book1); // Emma can't - already borrowed
emma.BorrowBook(book2); // Emma borrows another book
john.ShowBorrowedList();
emma.ShowBorrowedList();
john.ReturnBook(book1); // John returns
emma.BorrowBook(book1); // Now Emma can borrow itObject-Initializer-Syntax
C# bietet eine praktische Syntax, um beim Erzeugen von Objekten schnell Eigenschaften zuzuweisen:
// Long way
Book book1 = new Book();
book1.Title = "Crime and Punishment";
book1.Author = "Dostoevsky";
book1.PageCount = 671;
// Object Initializer - Short and clean
Book book2 = new Book
{
Title = "Crime and Punishment",
Author = "Dostoevsky",
PageCount = 671
};
// Can even write in one line (for small objects)
Book book3 = new Book { Title = "1984", Author = "Orwell" };Das Schlüsselwort this
this bedeutet „das aktuelle Objekt“. Besonders nützlich ist es, wenn Parameternamen mit Eigenschaftsnamen übereinstimmen:
public class Player
{
public string Name { get; set; }
public int Score { get; set; }
// Parameter name same as property name
public void SetInfo(string Name, int Score)
{
this.Name = Name; // this.Name = class property
this.Score = Score; // Name = parameter
}
// Method chaining with this (Fluent API)
public Player SetName(string name)
{
this.Name = name;
return this; // Return self
}
public Player SetScore(int score)
{
this.Score = score;
return this;
}
}
// Fluent API usage
Player player = new Player()
.SetName("Sarah")
.SetScore(100);Zusammenfassung: Klasse und Objekt
| Klasse | Objekt |
|---|---|
| Bauplan, Vorlage | Konkrete Instanz |
| Belegt keinen Speicher | Belegt Speicher |
| Definition | Verwendung |
| Eine | Beliebig viele |
| Backform | Kuchen |
Nächster Schritt: der Konstruktor
Die Konzepte Klasse und Objekt haben wir verstanden. Wie Ihnen vielleicht aufgefallen ist, kann es aber mühsam sein, nach dem Erzeugen eines Objekts jede Eigenschaft einzeln zuzuweisen.
Im nächsten Beitrag lernen wir das Konzept des Konstruktors kennen: jene besondere Methode, die beim Erzeugen eines Objekts automatisch läuft und Anfangswerte setzt.
Bis dahin: Schreiben Sie viele Klassen und erzeugen Sie Objekte! Übung ist die beste Lehrmeisterin. 🚀
Dies ist der zweite Beitrag der Reihe „OOP mit C#“. Im vorherigen Beitrag haben wir OOP vorgestellt, im nächsten behandeln wir das Thema Konstruktor.