Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
44m 47s
In Lektion 16 des Kurses "C# App Start to Finish" baut Tim Corey weiter am Formular "Turnier erstellen", aber das eigentliche Lernziel geht weit über das Verkabeln von Buttons und Listenboxen hinaus. Wenn Tim die Verbindung von Formularen herstellt, stellt er ein grundlegendes Software-Design-Konzept in C# vor: Schnittstellen, die für lose Kopplung verwendet werden. Diese Lektion zeigt Schnittstellen nicht als abstraktes akademisches Konzept, sondern als praktisches Werkzeug zur Lösung realer Probleme in einer WinForms-Anwendung.
In diesem Artikel werfen wir einen genaueren Blick darauf, wie Tim Corey Schnittstellen erklärt, warum er sie verwendet und wie sie helfen, enge Kopplungen zu vermeiden. Alle Erklärungen, Begründungen und Schlussfolgerungen kommen direkt aus Tims Durchgang, indem seine Abläufe, Terminologie und Beispiele aus dem Transkript verwendet werden.
Um 1:18 beginnt Tim mit dem Verkabeln der UI-Elemente "Preis erstellen" und "Team erstellen". Er weist sofort darauf hin, dass dieser Schritt einschüchternd wirken kann, nicht weil es schwer ist, ein anderes Formular aufzurufen, sondern weil Menschen beim korrekten Zurückgeben von Daten normalerweise Fehler machen.
Tim erklärt, dass die Herausforderung nicht darin besteht, ein weiteres Formular zu öffnen – das ist der einfache Teil. Die Herausforderung besteht darin, wie ein Formular ohne langfristige Designprobleme mit einem anderen kommuniziert. Hier beginnt es wichtig zu werden, Verträge anstelle von Abhängigkeiten zu definieren.
Um 1:34 spricht Tim explizit einen häufigen Fehler an: das direkte Koppeln des Formulars "Turnier erstellen" mit dem Formular "Preis erstellen". Bei diesem Ansatz weiß eine Klasse genau, mit welcher anderen Klasse sie spricht.
Tim erklärt, dass dies enge Kopplung verursacht, was bedeutet, dass die Formulare direkt voneinander abhängig sind. Wenn ein Formular sich ändert, wird das andere beeinflusst. Wenn ein anderer Teil des Programms später dieselbe Funktionalität benötigt, kann sie nicht erneut verwendet werden.
Er betont, dass, obwohl dies kompilieren und funktionieren mag, es keine gute langfristige Designentscheidung ist, insbesondere in größeren Systemen oder professionellen Umgebungen.
Um 2:02 hält Tim inne und schreibt die Schritte auf, anstatt sofort mit dem Code zu beginnen. Er listet auf:
Formular "Preis erstellen" aufrufen
Einen PrizeModel zurückbekommen
Es zur Liste der ausgewählten Preise hinzufügen
Tim erklärt, dass das Schreiben von Schritten zuerst hilft, Logikfehler zu vermeiden und die Absicht des Codes klar zu machen. Dieses strukturierte Denken wird besonders wichtig, sobald Schnittstellen eingeführt werden, weil Schnittstellen definieren, was geschehen muss, nicht wie es geschieht.
Um 4:56 erklärt Tim ein wichtiges Detail über Modelle, die herumgereicht werden. Er erinnert die Zuschauer daran, dass sie Adressen herumreichen, keine Kopien von Objekten.
Wenn der Preis über den Daten-Connector gespeichert wird, hat das Modell bereits seine ID ausgefüllt. Tim weist darauf hin, dass es oft unnötig ist, das Modell erneut zurückzugeben, da die Instanz bereits geändert wurde.
Dies verstärkt, warum Schnittstellen nicht existieren, um Daten blind zu übertragen – sie existieren, um Fertigstellung und Verantwortung zu signalisieren, nicht Duplikation.
Um 6:42 diskutiert Tim die Idee, ein PrizeModel in den Formularkonstruktor zu übergeben, sodass beide Formulare dieselbe Instanz teilen.
Er erklärt, warum dies in einem realen Anwendungsfall scheitert: Wenn der Benutzer das Formular abbricht, hat man am Ende einen leeren oder ungültigen Preis in seiner Liste. Tim zeigt, dass nur weil zwei Klassen Instanzdaten teilen können, nicht bedeutet, dass sie es sollten.
Dieser Moment verstärkt die Idee, dass Schnittstellen das Verhalten definieren, nicht die Datenspeicherung.
Um 7:46 spricht Tim einen anderen gängigen Ansatz an: das gesamte Formular "Turnier erstellen" in das Formular "Preis erstellen" zu übergeben und eine öffentliche Methode wie SavePrize aufzurufen.
Tim erklärt, warum dies noch schlechter ist:
Das Preisformular weiß nun genau, welche Klasse es aufruft
Keine andere, nicht verwandte Klasse kann das Preisformular wiederverwenden
Die Klasse ist in einen einzigen Anwendungsfall eingesperrt
Er benennt dies explizit als enge Kopplung, die wir zu vermeiden versuchen.
Um 9:01 führt Tim die Lösung ein: eine Schnittstelle.
Er erstellt eine neue Schnittstelle mit dem Schlüsselwort "interface" und nennt sie IPrizeRequester. Tim erinnert die Zuschauer daran, dass eine Schnittstelle:
Keine Klasse ist
Keine konkreten Methoden enthält
Existiert, um einen Vertrag zu definieren
Die Schnittstelle enthält eine einzige Methode:
Tim erklärt, dass diese Methode definiert, was geschehen muss, nicht wie es geschieht.
Um 9:40 erklärt Tim, dass jeder, der diese Schnittstelle implementiert, sich verpflichtet, diese Methode zu unterstützen. Die Schnittstelle hat standardmäßig öffentliche Mitglieder und erklärt keine Instanzdaten.
Hier macht Tim klar, dass Schnittstellen Fähigkeit, nicht Speicher definieren. Die implementierende Klasse entscheidet, was zu tun ist, wenn die Methode aufgerufen wird.
Um 10:19 ändert Tim den Formular-Konstruktor "Preis erstellen", um einen IPrizeRequester anstelle eines konkreten Formulars zu akzeptieren.
Er erklärt, dass dies bedeutet:
Jemand wird das Formular aufrufen
Das Formular weiß nicht, wer das ist
Die einzige Anforderung ist, dass der Anrufer die Schnittstelle implementiert
Dies ist lose Kopplung in der Praxis. Das Preisformular hängt von einem Schnittstellentyp ab, nicht von einer spezifischen Klasse.
Um 11:06 speichert Tim die Schnittstelleninstanz auf Klassenebene. Er erklärt, dass Konstruktorparameter nur innerhalb des Konstruktors existieren, es sei denn, sie werden gespeichert.
Dies ermöglicht es dem Preisformular, später PrizeComplete aus dem Button-Klick-Ereignis aufzurufen.
Um 11:49 demonstriert Tim den entscheidenden Moment:
callingForm.PrizeComplete(model);
Er erklärt, dass das Preisformular nun an den zurückruft, der die Schnittstelle implementiert hat, und sagt:
"Ich bin fertig, und hier ist das fertiggestellte Modell."
Erst nach diesem Anruf schließt sich das Formular. Dies garantiert, dass der Preis nur hinzugefügt wird, wenn die Erstellung erfolgreich war.
Um 13:29 wechselt Tim zum Formular "Turnier erstellen" und implementiert die Schnittstelle.
Er erklärt das Schlüsselwort this um 13:58 und beschreibt es als die aktuelle Instanz – das tatsächliche Objekt im Speicher. Indem er this übergibt, übergibt das Formular seine Adresse, jedoch nur durch den Schnittstellenvertrag.
Um 18:41 führt Tim eine zweite Schnittstelle ein: ITeamRequester.
Er erklärt, dass eine Klasse zwar nur von einer Basisklasse erben kann (wie Form), aber mehrere Schnittstellen implementieren kann. Dies ermöglicht es einer einzelnen Klasse, mehrere unabhängige Verhaltensweisen ohne Mehrfachvererbung zu unterstützen.
Tim betont, dass Schnittstellen keinen Code importieren – sie definieren nur erforderliche Methoden.
Gegen 42:08 reflektiert Tim darüber, warum die Verwendung von Mustern wichtig ist. Durch Wiederholen derselben schnittstellenbasierten Struktur werden fehlende Schritte offensichtlich und das Debuggen erleichtert.
Tim ermutigt dazu, Dinge aufzuschreiben, konsistente Muster zu verwenden und nicht zu versuchen, alles im Kopf zu behalten. Seiner Meinung nach geht es bei gutem Design nicht um Perfektion – es geht um Klarheit, Struktur und die Erleichterung zukünftiger Änderungen.
In Lektion 16 verwendet Tim Corey einen realen WinForms-Anwendungsfall, um zu demonstrieren, wie Schnittstellen lose Kopplung ermöglichen. Anstatt sich auf abstrakte Beispiele zu verlassen, zeigt er, wie Schnittstellen:
Verträge definieren
Klassen entkoppeln
Mehrere Schnittstellen in einer einzigen Klasse unterstützen
Enge Kopplung verhindern
Die langfristige Flexibilität verbessern
Am Ende der Lektion funktioniert die Anwendung nicht nur – sie ist so strukturiert, dass sie Wachstum, Wiederverwendung und Klarheit unterstützt. Tims Ansatz lässt Schnittstellen praktisch, zweckmäßig und unerlässlich in der realen C#-Entwicklung erscheinen.
Für eine vollständige, durchgängige Anwendung dieser Schnittstellen- und losen-Kopplungskonzepte, schauen Sie sich die vollständige Lektion 16 Video an, in dem jeder Schritt innerhalb der funktionierenden C#-Anwendung implementiert, getestet und verfeinert wird.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy