Aufgabe
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()
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()
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
Return _SpielerName
_SpielerName = value
Public Property Gehalt() As Double
Return _Gehalt
Set(ByVal value As Double)
_Gehalt = value
Public ReadOnly Property AnzahlTore() As Integer Implements ISpieler.AnzahlTore
Return _AnzahlTore
Public Sub Torschiessen() Implements ISpieler.Torschiessen
_AnzahlTore += 1
_Gehalt += 50
End Class
Public Class Profispieler
_Gehalt += 1000
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)
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))
Public Class Spieler
Public Property Position() As String
Public Property SpielerName() As String
Public Property AnzahlTore() As Integer
Set(ByVal value As Integer)
_AnzahlTore = value
Inherits Spieler
AnzahlTore += 1
' AnzahlTore = AnzahlTore + 1
Gehalt += 50
Gehalt += 1000
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 Basichttp://msdn2.microsoft.com/de-de/library/b86b82w0(VS.80).aspx
Class-Anweisunghttp://msdn2.microsoft.com/de-de/library/wa0hwf23(VS.80).aspx
Vererbung in Visual Basichttp://msdn2.microsoft.com/de-de/library/5x4yd9d5(VS.80).aspx
Schnittstellen in Visual Basichttp://msdn2.microsoft.com/de-de/library/28e2e18x(VS.80).aspx
Schöne Grüße
Daniel