none
Wie zwei Klassen über ein Interface koppeln? RRS feed

  • Frage

  • Hallo,
    ich will zwei Klassen (Form1 und Auswertung) über ein Interface (IAuswertung) miteinander verbinden (Dependency Injection).
    Folgendes Beispiel soll das zeigen:
    Beide Klassen haben das Interface implementiert.
    Die Form1 hat eine CheckBox, welche ich in der Klasse Auswertung auswerten will. Zum Testen rufe ich deshalb in der Form1
    über ein Button die Methode Ergebnis() in der Klasse Auswertung auf.
    Das Ergebnis ist aber immer das gleiche: false.

    Was mache ich falsch?

    Alexander



    Public Class Form1 : Implements IAuswertung
        Dim TestKlasse As Auswertung = New Auswertung()

        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
          CheckBox1.Checked = True
        End Sub

        Public Property IsBrief As Boolean Implements IAuswertung.IsBrief
          Get
            Return CheckBox1.Checked
          End Get
          Set(value As Boolean)
            CheckBox1.Checked = value
          End Set
        End Property

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
          TestKlasse.Ergebnis()
        End Sub
    End Class



    Public Class Auswertung : Implements IAuswertung
        Private isChecked As Boolean

        Public Property IsBrief As Boolean Implements IAuswertung.IsBrief
          Get
            Return isChecked
          End Get
          Set(value As Boolean)
            isChecked = value
          End Set
        End Property

        Public Sub Ergebnis()
          Console.WriteLine("Ergebnis ist: " & isChecked)
        End Sub
    End Class



    Public Interface IAuswertung

        Property IsBrief() As Boolean

    End Interface
    Sonntag, 19. Juni 2011 16:33

Antworten

  • Hallo Alexander,

    damit das Formular wirklich die Auswertung repräsentiert, muss sie dort auch die Werte setzen:

    Public Class Form1 : Implements IAuswertung
       Dim TestKlasse As New Auswertung()
      
       ' Reflektiert die Eigenschaft von Auswertung
       Public Property IsBrief As Boolean Implements IAuswertung.IsBrief
       Get
         Return TestKlasse.IsBrief
       End Get
       Set(value As Boolean)
         TestKlasse.IsBrief = value
       End Set
      End Property
    
      ' Wert in Auswertung (hier TestKlasse) setzen
      Private Sub CheckBox1_CheckedChanged(sender as Object, e as EventArgs) _ 
         Handles CheckBox1.CheckedChanged
         TestKlasse.IsBrief = CheckBox1.Checked
      End Sub
    

    Oben liefert die Eigenschaft IsBrief es Formulars den aktuellen Zustand von TestKlasse.
    Eine Änderung des Checked Status wiederum setzt über die Ereignisbehandlung den Wert entsprechend.

    Ein alternativer Ansatz wäre, dafür eine Datenbindung einzurichten -
    wofür dann auch die INotifyPropertyChanged Schnittstelle in Auswertung implementiert werden sollte,
    damit die Änderung beiderseitig reflektiert werden, siehe dazu:
    Gewusst wie: Implementieren der INotifyPropertyChanged-Schnittstelle
    und Gewusst wie: Auslösen von Änderungsbenachrichtigungen mithilfe von "BindingSource" und der "INotifyPropertyChanged"-Schnittstelle

    Gruß Elmar

     

    • Als Antwort markiert AlexanderRi Montag, 20. Juni 2011 07:11
    • Tag als Antwort aufgehoben AlexanderRi Dienstag, 21. Juni 2011 12:53
    • Als Antwort markiert AlexanderRi Dienstag, 21. Juni 2011 12:55
    Sonntag, 19. Juni 2011 17:33
    Beantworter