Übungsaufgabe und Lösung zu „Get the BASICs, Visual Basic für Einsteiger und Umsteiger“, Teil 6


Aufgabe



  • Schreiben Sie die zwei Klassen Amateurspieler und Profispieler


  • Beide Klassen sollen ein Interface ISpieler implementieren


    • Property SpielerName

    • Property Position

    • Methode Torschiessen

  • Schreiben Sie eine Methode welche die Namen, Position und geschossenen Tooooore der Spieler ausgibt

Lösung (1)


Option Strict On


Option Explicit On


 


Module Module1


 


    Sub Main()


 


        Dim Amateur As New Amateurspieler


        Amateur.SpielerName = “Amateur XYZ”


        Amateur.Position = “Sturm”


        Amateur.Torschiessen()


 


        Dim Profi As New Profispieler


        Profi.SpielerName = “Profi ABC”


        Profi.Position = “Tor”


        Profi.Torschiessen()


        Profi.Torschiessen()


 


        Ausgabe(Amateur)


        Ausgabe(Profi)


 


    End Sub


 


    Public Sub Ausgabe(ByVal Spieler As ISpieler)


 


        Console.WriteLine(String.Format(“Name des Spielers: {0}”, Spieler.SpielerName))


        Console.WriteLine(String.Format(“Position des Spielers: {0}”, Spieler.Position))


        Console.WriteLine(String.Format(“Geschossene Toooore: {0}”, Spieler.AnzahlTore))


        Console.WriteLine()


        Console.WriteLine()


 


    End Sub


 


End Module


 


Interface ISpieler


 


    Property SpielerName() As String


    Property Position() As String


    ReadOnly Property AnzahlTore() As Integer


    Sub Torschiessen()


 


End Interface


 


Public Class Amateurspieler


    Implements ISpieler


 


 


    Private _Position As String


    Private _SpielerName As String


    Private _AnzahlTore As Integer


    Private _Gehalt As Double


 


 


    Public Property Position() As String Implements ISpieler.Position


        Get


            Return _Position


        End Get


        Set(ByVal value As String)


            _Position = value


        End Set


    End Property


 


    Public Property SpielerName() As String Implements ISpieler.SpielerName


        Get


            Return _SpielerName


        End Get


        Set(ByVal value As String)


            _SpielerName = value


        End Set


    End Property


 


    Public Property Gehalt() As Double


        Get


            Return _Gehalt


        End Get


        Set(ByVal value As Double)


            _Gehalt = value


        End Set


    End Property


 


    Public ReadOnly Property AnzahlTore() As Integer Implements ISpieler.AnzahlTore


        Get


            Return _AnzahlTore


        End Get


    End Property


 


 


    Public Sub Torschiessen() Implements ISpieler.Torschiessen


        _AnzahlTore += 1


        _Gehalt += 50


    End Sub


 


End Class


 


Public Class Profispieler


    Implements ISpieler


 


    Private _Position As String


    Private _SpielerName As String


    Private _AnzahlTore As Integer


    Private _Gehalt As Double


 


 


    Public Property Position() As String Implements ISpieler.Position


        Get


            Return _Position


        End Get


        Set(ByVal value As String)


            _Position = value


        End Set


    End Property


 


    Public Property SpielerName() As String Implements ISpieler.SpielerName


        Get


            Return _SpielerName


        End Get


        Set(ByVal value As String)


            _SpielerName = value


        End Set


    End Property


 


    Public Property Gehalt() As Double


        Get


            Return _Gehalt


        End Get


        Set(ByVal value As Double)


            _Gehalt = value


        End Set


    End Property


 


    Public ReadOnly Property AnzahlTore() As Integer Implements ISpieler.AnzahlTore


        Get


            Return _AnzahlTore


        End Get


    End Property


 


 


    Public Sub Torschiessen() Implements ISpieler.Torschiessen


        _AnzahlTore += 1


        _Gehalt += 1000


    End Sub


 


End Class


 


Wie in o.g. Lösung zu sehen ist stellt die Implementierung des Interfaces ISpieler in den Klassen Amateurspieler und Profispieler sicher, dass beide Klassen alle Properties und alle Methoden des Interfaces implementieren. Unschön ist jedoch, dass beide Klassen sehr viel gleichen Code beinhalten wie in dem nachfolgend skizziertem Klassendiagramm ersichtlich ist.


Implementierung der Aufgabe mit Hilfe eines Interfaces.


Aus diesem Grund wurden in der zweiten Lösung Teile beider Klassen in eine allgemeine Basisklasse Spieler ausgelagert. An dem neuen Klassendiagramm wird sehr schön deutlich, wie der davor doppelt vorhandene Code jetzt nur noch an einer Stelle implementiert werden muss.


Auslagern von gemeinsam verwendetem Code in einer Basisklasse.


Lösung (2)


Option Strict On


Option Explicit On


 


Module Module1


 


    Sub Main()


 


        Dim Amateur As New Amateurspieler


        Amateur.SpielerName = “Amateur XYZ”


        Amateur.Position = “Sturm”


        Amateur.Torschiessen()


 


        Dim Profi As New Profispieler


        Profi.SpielerName = “Profi ABC”


        Profi.Position = “Tor”


        Profi.Torschiessen()


        Profi.Torschiessen()


 


        Ausgabe(Amateur)


        Ausgabe(Profi)


 


    End Sub


 


    Public Sub Ausgabe(ByVal meinSpieler As Spieler)


 


        Console.WriteLine(String.Format(“Name des Spielers: {0}”, meinSpieler.SpielerName))


        Console.WriteLine(String.Format(“Position des Spielers: {0}”, meinSpieler.Position))


        Console.WriteLine(String.Format(“Geschossene Toooore: {0}”, meinSpieler.AnzahlTore))


        Console.WriteLine()


        Console.WriteLine()


 


    End Sub


 


End Module


 


Public Class Spieler


 


    Private _Position As String


    Private _SpielerName As String


    Private _AnzahlTore As Integer


    Private _Gehalt As Double


 


 


    Public Property Position() As String


        Get


            Return _Position


        End Get


        Set(ByVal value As String)


            _Position = value


        End Set


    End Property


 


    Public Property SpielerName() As String


        Get


            Return _SpielerName


        End Get


        Set(ByVal value As String)


            _SpielerName = value


        End Set


    End Property


 


    Public Property Gehalt() As Double


        Get


            Return _Gehalt


        End Get


        Set(ByVal value As Double)


            _Gehalt = value


        End Set


    End Property


 


    Public Property AnzahlTore() As Integer


        Get


            Return _AnzahlTore


        End Get


        Set(ByVal value As Integer)


            _AnzahlTore = value


        End Set


    End Property


 


End Class


 


Interface ISpieler


 


    Sub Torschiessen()


 


End Interface


 


Public Class Amateurspieler


    Inherits Spieler


    Implements ISpieler


 


    Public Sub Torschiessen() Implements ISpieler.Torschiessen


        AnzahlTore += 1


        ‘ AnzahlTore = AnzahlTore + 1


        Gehalt += 50


    End Sub


 


End Class


 


Public Class Profispieler


    Inherits Spieler


    Implements ISpieler


 


 


    Public Sub Torschiessen() Implements ISpieler.Torschiessen


        AnzahlTore += 1


        Gehalt += 1000


    End Sub


 


End Class


 


P.S. Da die Frage während des Webcasts aufkam: Die Bilder wurden mit dem Klassendesigner des Visual Studios 2005 erstellt. Der Klassendesigner ist ab der Standard Version enthalten.


Referenzen:


Objektorientiertes Programmieren in Visual Basic
http://msdn2.microsoft.com/de-de/library/b86b82w0(VS.80).aspx


Class-Anweisung
http://msdn2.microsoft.com/de-de/library/wa0hwf23(VS.80).aspx


Vererbung in Visual Basic
http://msdn2.microsoft.com/de-de/library/5x4yd9d5(VS.80).aspx


Schnittstellen in Visual Basic
http://msdn2.microsoft.com/de-de/library/28e2e18x(VS.80).aspx


Schöne Grüße


Daniel

Comments (0)