Ü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
https://msdn2.microsoft.com/de-de/library/b86b82w0(VS.80).aspx

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

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

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

Schöne Grüße

Daniel