Skip to content

Commit 5f202d1

Browse files
committed
updated: klassen slides oop
1 parent 290029a commit 5f202d1

File tree

2 files changed

+166
-39
lines changed

2 files changed

+166
-39
lines changed

slides/content/slides/SWP/PR/11_classes.md

Lines changed: 166 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ export:
2121
selectable: true
2222
---
2323

24-
# Objektorientierte Programmierung
24+
# Klassen
2525

26-
## Klassen
26+
## Einstieg in die objektorientierte Programmierung
2727

2828
---
2929
hideInToc: true
@@ -35,69 +35,143 @@ hideInToc: true
3535

3636
---
3737

38-
# Warum brauchen wir Klassen?
38+
# Klasse = der Bauplan 📝
3939

40-
Structs reichen für einfache Daten, aber sobald Dinge **Verhalten** haben (z. B. ein Auto, das fahren kann), brauchen wir **Klassen**.
40+
Eine Klasse ist wie ein **Bauplan** für ein **Haus**.
4141

42-
- Klassen sind das Herz der objektorientierten Programmierung (OOP).
43-
- Sie beschreiben wie etwas aussieht (Daten) und was es tun kann (Methoden).
42+
- Der Bauplan beschreibt, welche Räume, Fenster und Türen das Haus hat.
43+
- Aber solange der Plan nur auf Papier existiert, steht noch kein Haus.
4444

45+
```csharp {1-2,14}{lines:true}
46+
class Player
47+
{
48+
public int Lebenspunkte; // Daten in Form von Feldern
49+
50+
public Player(int lebenspunkte)
51+
{
52+
this.Lebenspunkte = lebenspunkte;
53+
}
54+
55+
public void Angreifen() // Methoden
56+
{
57+
Console.WriteLine($"Spieler greift an.");
58+
}
59+
}
60+
```
4561
<br>
4662

47-
**Beispiel:**
63+
> 👉 Eine Klasse ist nur die Anleitung, kein echtes Objekt im Speicher.
4864
49-
```csharp
50-
class Haus
65+
---
66+
67+
# Warum brauchen wir Klassen ❓
68+
69+
Um **Daten und Verhalten logisch zusammenzufassen**, sodass wir **komplexe Dinge** aus der realen Welt als **strukturierte, wiederverwendbare Objekte** im Programm abbilden können.
70+
71+
- Klassen sind das Herz der **objektorientierten Programmierung (OOP**).
72+
- Sie beschreiben wie etwas aussieht (**Daten**) und was es tun kann (**Methoden**).
73+
74+
```csharp {1-3,10-14}{lines:true}
75+
class Player
5176
{
52-
public int AnzahlFenster;
53-
public string Farbe;
77+
public int Lebenspunkte; // Felder = Daten
78+
79+
public Player(int lebenspunkte)
80+
{
81+
this.Lebenspunkte = lebenspunkte;
82+
}
5483

55-
public void OeffneFenster()
84+
public void Angreifen() // Methoden
5685
{
57-
Console.WriteLine("Fenster geöffnet!");
86+
Console.WriteLine($"Spieler greift an.");
5887
}
5988
}
6089
```
6190

91+
6292
---
6393

64-
# Klassen = der Bauplan 📝
94+
# Der Konstruktor = der Baumeister 👷‍♂️
6595

66-
Eine Klasse ist wie ein **Bauplan** für ein **Haus**.
96+
Damit aus einem Bauplan ein echtes Haus wird, braucht man jemanden, der es baut – den **Baumeister**.
6797

68-
- Der Bauplan beschreibt, welche Räume, Fenster und Türen das Haus hat.
69-
- Aber solange der Plan nur auf Papier existiert, steht noch kein Haus.
98+
In C# übernimmt das der **Konstruktor**.
7099

71-
```csharp
100+
```csharp {5-8}{lines:true}
72101
class Player
73102
{
74103
public int Lebenspunkte;
75104

105+
public Player(int lebenspunkte) // Konstruktor mit einem Parameter
106+
{
107+
this.Lebenspunkte = lebenspunkte;
108+
}
109+
76110
public void Angreifen()
77111
{
78112
Console.WriteLine($"Spieler greift an.");
79113
}
80114
}
81115
```
82116

83-
<br>
117+
---
118+
119+
# Standardkonstruktor
120+
121+
Eine Klasse hat **immer** einen Standardkonstruktor, also einen Konstruktor ohne Parameter, der keine Felder setzt.
84122

85-
> 👉 Diese Klasse ist nur die Anleitung, kein echtes Objekt im Speicher.
123+
```csharp {lines:true}
124+
class Player
125+
{
126+
public int Lebenspunkte;
127+
128+
public void Angreifen()
129+
{
130+
Console.WriteLine($"Spieler greift an.");
131+
}
132+
}
133+
```
86134

87135
---
88136

89-
# Der Konstruktor = der Baumeister 👷‍♂️
137+
# Standardkonstruktor überschreiben
90138

91-
Damit aus einem Bauplan ein echtes Haus wird, braucht man jemanden, der es baut – den **Baumeister**.
139+
Man kann den Standarkonstuktor überschreiben, um Felder mit "Standardwerten" zu befüllen.
92140

93-
In C# übernimmt das der **Konstruktor**.
141+
```csharp {5-8}{lines:true}
142+
class Player
143+
{
144+
public int Lebenspunkte;
94145

95-
```csharp
146+
public Player()
147+
{
148+
this.Lebenspunkte = 80;
149+
}
150+
151+
public void Angreifen()
152+
{
153+
Console.WriteLine($"Spieler greift an.");
154+
}
155+
}
156+
```
157+
158+
---
159+
160+
# Mehrere Konstruktoren
161+
162+
Es ist auch möglich mehrere Konstruktoren zu definieren
163+
164+
```csharp {5-13}{lines:true}
96165
class Player
97166
{
98167
public int Lebenspunkte;
99168

100-
public Player(int lebenspunkte) // Konstruktor
169+
public Player()
170+
{
171+
this.Lebenspunkte = 80;
172+
}
173+
174+
public Player(int lebenspunkte)
101175
{
102176
this.Lebenspunkte = lebenspunkte;
103177
}
@@ -116,40 +190,93 @@ class Player
116190
Wenn der Bauplan (Klasse) umgesetzt wird, entsteht ein konkretes **Objekt** – das „echte Haus“.
117191

118192
```csharp
119-
Player player = new Player(100);
120-
Player enemy = new Player(50);
193+
Player player = new Player(100); // neues Objekt ensteht
194+
195+
Player enemy = new Player(50); // ein weiteres Objekt entsteht
121196
122-
Console.WriteLine(player.Lebenspunkte); // 100
123-
Console.WriteLine(enemy.Lebenspunkte); // 50
197+
Player boss = new Player(); // ein weiteres Objekt, welches den Standardkonstruktor benutzt hat
124198
```
125199

126200
<br>
127201

128-
> 💡 Merke: Objekt = Instanz der Klasse.
202+
> 💡 Objekt = **Instanz der Klasse**.
129203
130204
---
131205

132-
# Objekte referenzieren
206+
# Objekte referenzieren 👉
133207

134-
Eine Klasse erstellt ein Objekt, und ein Objekt ist ein **Referenztyp** (*"referenzieren"*).
208+
Ein Objekt ist ein **Referenztyp**. Mit Variablen *referenzieren* (zeigen 👉) wir auf diese Objekte im Speicher.
135209

136210
**Stell dir ein Schulspind-System vor:**
137211
- Der Spind (Objekt) steht irgendwo im Schulhaus → das ist der Speicher im Heap.
138212
- Die Spindnummer (Referenz) steht auf deinem Schlüsselanhänger → das ist die Variable im Code.
139213

140214
```csharp
141-
Haus a = new Haus("Weiß"); // a speichert die Spindnummer
142-
Haus b = a; // b bekommt dieselbe Nummer
215+
Player player = new Player(100); // `player` speichert die "Spindnummer"
216+
Player samePlayer = player; // `samePlayer` bekommt die selbe "Spindnummer"
143217
144-
b.Farbe = "Grün";
145-
Console.WriteLine(a.Farbe); // Ausgabe: Grün
218+
samePlayer.Lebenspunkte = 150;
219+
Console.WriteLine(player.Lebenspunkte); // Ausgabe: 150
146220
```
147221

148-
➡️ Beide Variablen (`a` und `b`) zeigen auf dasselbe Objekt (im Speicher).
222+
➡️ **Beide** Variablen (`player` und `samePlayer`) **zeigen auf dasselbe Objekt** (im Speicher).
149223

150-
➡️ Variablen von Klassen speichern nicht das Objekt selbst,
151-
sondern nur eine Referenz (Adresse), um es zu erreichen.
224+
➡️ **Variablen von Klassen speichern** nicht das Objekt selbst,
225+
sondern **nur eine Referenz (Adresse)**, um es zu erreichen.
152226

227+
---
228+
layout: two-cols-header
229+
layoutClass: gap-8
230+
---
231+
232+
# Referenz- VS. Wertetypen
233+
234+
- Primitive Datentypen (e.g. `int`, `bool`, `char`) und *Structs* sind **Wertetypen** und befinden sich am **Stack**.
235+
- *Klassen* und *Arrays* sind **Referenztypen**. Sie referenzieren zum eigentlichen Objekt hin und befinden sich am **Heap**.
236+
237+
::left::
238+
239+
```csharp
240+
int x = 5;
241+
int y = 3;
242+
243+
StructRechteck sRect = new StructRechteck(12,18);
244+
ClassRechteck cRect = new ClassRechteck(9,15);
245+
246+
int[] zahlen = new int[]{5, 12, 3, 7, 6};
247+
```
248+
249+
250+
::right::
251+
![Stack vs Heap](./assets/classes-vs-structs-memory.drawio.png)
252+
253+
---
254+
255+
# Lebenszyklus von Variablen
256+
257+
```csharp {none|1-5,21|7-9,20|9-11,20|13-17|5,19}{lines:true}
258+
class Player
259+
{
260+
// 🔹 Feld der Klasse – gehört jedem Objekt "Spieler"
261+
// Lebt so lange, wie das Objekt im Speicher (Heap) existiert
262+
public int Lebenspunkte = 100;
263+
264+
// 🔹 Parameter `betrag`, lebt so lange bis die Methode endet
265+
public void Heile(int betrag)
266+
{
267+
// 🔹 Lokale Variable – lebt bis zum Methodenende
268+
int geheilt = 0;
269+
270+
// 🔹 Schleifenvariable `i` – lebt nur in der Schleife
271+
for (int i = 0; i < betrag; i++)
272+
{
273+
geheilt++; // i und geheilt leben auf dem Stack
274+
}
275+
276+
Lebenspunkte += geheilt; // Schreiben auf das Feld (Heap), da `geheilt` Variable bei Methodenende stirbt
277+
}
278+
}
279+
```
153280
---
154281

155282
# Zusammenfassung
30.5 KB
Loading

0 commit comments

Comments
 (0)