In VB.NET ist es möglich in einem Inteface komplette Klassen zu definieren. Kann jemand nachvollziehbar den Sinn des Ganzen schildern? Ich bin immer davon ausgegangen das ein Interface eine Art "Vertrag" darstellt und ohne Implementierung daherkommt.
Namespace Views Public Interface IView Event OnForceHandlingData As EventHandler(Of EventArg) Property TaggedInformationString() As String Sub ForceRefreshData(Optional ByVal MoveToKey As Object = Nothing) Sub VisualizeLayoutChanged(ByVal changed As Boolean) Class HeightDefinition Public Sub New(ByVal DefaultHeight As Integer, Optional ByVal MinHeight As Integer = -1, Optional ByVal MaxHeight As Integer = -1) Me.DefaultHeight = DefaultHeight Me.MinHeight = MinHeight Me.MaxHeight = MaxHeight End Sub Public DefaultHeight As Integer Public MinHeight As Integer Public MaxHeight As Integer End Class End Interface End Namespace
Eine "halbe" Antwort: zu einer Schnittstelle gehören im allgemeinen neben dem Vertrag zum Verhalten der Schnittstelle auch die Beschreibung der Daten, die über diese Schnittstelle ausgetauscht werden, und die Exceptions, die auftreten können. Exceptions kann man nicht hinter einem Interface verbergen und bei Datentypen ist es nicht sinnvoll (warum wohl gibt es kein IString?), also ist es oft so, dass ein Interface mit einigen Klassen eng gekoppelt ist, die in seinen Signaturen auftauchen. Schön ist es, wenn diese allgemeiner Natur sind (wie String eben), aber es kann auch sein, dass sie nur im Kontext der Schnittstelle benötigt werden.
Von daher gibt es eine gewisse Motivation, bestimmte Klassen und Interfaces zusammenhalten zu wollen. Aber ich würde sie deshalb trotzdem in eigene Dateien stecken. VB.NET scheint es auch anders zu ermöglichen, aber ob das auch der Grund ist, warum diese Option geschaffen wurde - das ist die Hälfte der Antwort, die ich schuldig bleiben muss.
Ja, das denke ich mir auch, allerdings zielt meine Frage darauf ab warum diese Art der Interfaceimplementierung möglich ist und nicht warum man diese besser vermeiden sollte.
Die guten Sachen einer Programmiersprache verwenden, die schlechten nicht anwenden. Konkrete Klassen in abstrakten Interfaces zu definieren ist absoluter Blödsinn. Es gibt immer Mechanismen, mit denen man Programmierparadigmen wie OO maltretieren kann. Nicht mehr drüber nachdenken, sondern konkrete Dinge von abstrakten trennen.