You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 07_OOPGrundlagenI.md
+124Lines changed: 124 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -645,6 +645,130 @@ public class Program
645
645
646
646
> **Vertiefung:** Vorlesung 08 zeigt **Properties** als idiomatische C#-Lösung für „kontrollierter Zugriff auf private Felder" (statt expliziter Getter/Setter wie in 07a). Vorlesung 09 erklärt `protected` und die Wechselwirkungen mit Vererbung.
647
647
648
+
## Beispiel: `internal` in Aktion
649
+
650
+
`public` und `private` sind in einem einzigen `.cs`-File leicht zu sehen. `internal` braucht eine **zweite Assembly**, damit der Effekt überhaupt sichtbar wird — innerhalb *einer* Assembly verhält sich `internal` wie `public`. Dazu steigen wir kurz in ein echtes Mini-Projekt unter [`code/08_OOP/assemblies_dotnet/`](code/08_OOP/assemblies_dotnet/) ein.
651
+
652
+
```ascii
653
+
assemblies_dotnet/
654
+
│
655
+
├── assemblies_dotnet.slnx <- Solution: Klammer um beide Projekte (XML, ab .NET 9)
|**Solution** (`.slnx`) | Verwaltungs-Container für mehrere Projekte | nur Tooling-Hilfe, baut selbst nichts. Klassisches Format `.sln` ist im Industrieumfeld noch verbreitet, das schlankere XML-Format `.slnx` ist seit .NET 9 verfügbar |
673
+
|**Projekt** (`.csproj`) | Beschreibung, was kompiliert wird | erzeugt jeweils **eine** Assembly |
publicvoidRegister(stringname, stringsound="Miau") { ... } // legt Animal an
706
+
publicstringMorningCall() { ... } // gibt Text zurück
707
+
}
708
+
}
709
+
```
710
+
711
+
`FarmFacade`*darf*`Animal` benutzen, weil beide zur selben Assembly gehören. Von außen — etwa aus `MyApp.dll` — ist nur `FarmFacade` sichtbar; `Animal` bleibt unsichtbar, obwohl der Quellcode in derselben Repository-Datei offen lesbar steht.
712
+
713
+
> **Beachten Sie das Fassaden-Muster:**`MorningCall()` gibt nur einen `string` zurück, also einen Standardtyp. Der interne `Animal`-Typ überquert die Assembly-Grenze nie. Das ist *die* idiomatische Verwendung von `internal`.
714
+
715
+
### Drei Schritte, die Sie selbst ausprobieren
716
+
717
+
**Schritt 1 — bauen und ausführen:**
718
+
719
+
```bash
720
+
cd code/08_OOP/assemblies_dotnet
721
+
dotnet build # baut MyClass.dll, dann MyApp.dll
722
+
dotnet run --project MyApp
723
+
```
724
+
725
+
Erwartete Ausgabe:
726
+
727
+
```
728
+
Mein Name ist Kitty, Miau!
729
+
Mein Name ist Wally, Wuff!
730
+
Mein Name ist Berta, Muuh!
731
+
```
732
+
733
+
Die App ruft `FarmFacade` auf, registriert drei Tiere und holt sich den `MorningCall`-Text. Das funktioniert — `FarmFacade` ist `public`.
734
+
735
+
**Schritt 2 — den verbotenen Zugriff sehen:**
736
+
737
+
In `MyApp/Program.cs` ist im `Main` ein Experimentier-Block enthalten. Entfernen Sie die führenden `//` vor der Animal-Zeile:
738
+
739
+
```csharp
740
+
varcat=newAnimal("Kitty");
741
+
```
742
+
743
+
`dotnet build` liefert:
744
+
745
+
```
746
+
error CS0122: 'Farm.Animal' is inaccessible due to its protection level
747
+
```
748
+
749
+
Der Compiler **sieht** den Typ `Animal` (er steht ja im Quellcode der referenzierten DLL), erlaubt aber den Zugriff nicht — `internal` blockt über die Assembly-Grenze hinweg.
750
+
751
+
**Schritt 3 — die Grenze öffnen:**
752
+
753
+
In `MyClass/Farmland.cs` das `internal` durch `public` ersetzen:
754
+
755
+
```csharp
756
+
publicstructAnimal { ... }
757
+
```
758
+
759
+
`dotnet build` läuft wieder durch. Genau dieser Toggle macht den Unterschied erfahrbar: Eine Bibliothek entscheidet, *was* sie nach außen anbietet — und versteckt den Rest.
| Ein .NET-Programm kann aus mehreren Projekten und Assemblies bestehen | Realität jenseits der „eine `Main`-Datei"-Vorlesungssicht |
766
+
|`internal` operiert auf **Assembly-Grenze**, nicht auf Namespace-Grenze | Häufigste Verwechslung — einmal richtig verstehen |
767
+
|**Öffentliche Fassade + interne Implementierung** ist *das* Standardmuster für Bibliotheken | Genau dafür existiert `internal`|
768
+
|`dotnet build` erkennt Abhängigkeitsreihenfolge und baut nur, was sich geändert hat | Modulare Builds = schnellere Iteration |
769
+
770
+
> **Vertiefung in 08:** Wir schauen uns dort an, wie diese Struktur per `dotnet new sln` / `dotnet new console` / `dotnet new classlib` / `dotnet add reference` von Hand erzeugt wird — und warum NuGet-Pakete im Kern dasselbe Konzept sind, nur mit zusätzlicher Distribution.
771
+
648
772
## Aufgaben
649
773
650
774
1.**Übersetzen.** Übertragen Sie das `Animal`-Beispiel aus 07a (mit `make_noise`) nach C#. Erzeugen Sie drei Instanzen und rufen Sie `MakeNoise()` in einer Schleife auf.
0 commit comments