Ü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.
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.
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