Allgemeine Frage zu VB.NET

Tubbycore

Grünschnabel
Hallo ich habe eine allgemeine Frage zum Thema Overload vs. Override
Ihr müsst nich erklären was die unterschiede sind, die kenn ich. Ich frage mich vielmehr warum ich in einer abgeleiteten Klasse Overload nehmen kann obwohl dies genau die gleiche Methode ist wie in der Basisklasse? Müsste ich diese nicht überschreiben lassen, da dies ja genau die gleiche Methode ist?
 
Hallo Tubbycore.
Ich bin mir nicht sicher, ob ich deine Frage richtig verstanden habe.
Ich mache mal ein Beispiel. Nehmen wir eine Klasse "Basisklasse", die eine Methode "MeineMethode(int a, int b)" und eine Überladung "MeineMethode(double a, double b) hat.
Nehmen wir weiter an, dass es eine zweite Klasse "AbgeleiteteKlasse" gibt, die von "Basisklasse" erbt.
Du instanziierst ein Objekt der "AbgeleiteteKlasse" in der Variable "MeineInstanz"
C#:
AbgeleiteteKlasse MeineInstanz = new AbgeleiteteKlasse();
und schreibst folgenden Code
C#:
MeineInstanz.MeineMethode(1,2)
Ist deine Frage nun warum letzte Codezeile möglich ist, obwohl "MeineInstanz" doch ein Objekt vom Typ "AbgeleiteteKlasse" und nicht "Basisklasse" ist?
 
Nicht ganz. Ich mache ein Beispiel:

Code:
Public Class PKW

Sub einsteigen(anzahl As Integer)
//CODE PKW
End Sub

End Class

Code:
Public Class BMW
    Inherits PKW

Sub einsteigen(anzahl As Integer)
//CODE BMW
End Sub

End Class

Warum muss ich in der Klasse BMW vor der Methode einsteigen ein "Overloads" schreiben? Da dies doch eindeutig die gleiche Methode ist, dürfte ich doch ganicht in der Lage sein dies so zu schreiben? Aber mit einem "Overloads"geht es.

Dies hat mich ein wenig ins grübeln gebracht da ich angenommen habe den Unterschied zwischen "Überladen" und "Überschreiben" zu kennen. Vielleicht ist dies auch etwas VB.NET spezifisches.
 
Warum muss ich in der Klasse BMW vor der Methode einsteigen ein "Overloads" schreiben?
Musst du nicht! Wenn du "Overloads" weglässt, dann wird das vom Compiler so behandelt, als hättest du "Shadows" davorgeschrieben:
Code:
Public Class BMW
    Inherits Pkw

    Shadows Sub Einsteigen(ByVal Anzahl As Integer)
        ' Code BMW
    End Sub
End Class
Es gibt drei Möglichkeiten:
  • eine Methode überschreiben (Overrides)
  • eine Methode überladen (Overloads)
  • eine Methode eine andere Methode verstecken lassen (Shadows)
Ich habe die drei Punkte jeweils mit dem entsprechenden Kapitel im VB.Net Galileo Openbook verlinkt.
 
Ah ok "Shadow" also ;)
Und wenn ich "Overloads" davorschreiben wird das dann immernoch wie "Shadow" behandelt? Ich frage aus dem Grund, da mir der Compiler dies als Warnung anzeigt:
"Wenn Sie die Basismethode überladen möchten, muss die Methode als "Overloads" deklariert werden."
 
Wenn du Overloads davor schreibst, dann sollte die Warnung verschwinden.
In dem Spezialfall, dass die Methodensignatur der Basisklasse identisch mit der aus der abgeleiteten Klasse ist, verhält sich "Overloads" tatsächlich genau so wie "Shadows".
Vielleicht verdeutlicht folgendes Beispiel die Sache. Erstelle ein neues Consolenprojekt und füge folgende Datei als Modul1.vb ein:
Code:
Module Module1

    Sub Main()
        Dim Auto As New BMW()
        Dim IntegerPersonen As Integer = 0
        Dim DoublePersonen As Double = 0
        Auto.Einsteigen(IntegerPersonen)
        Auto.Einsteigen(DoublePersonen)
        DirectCast(Auto, PKW).Einsteigen(IntegerPersonen)
        DirectCast(Auto, PKW).Einsteigen(DoublePersonen)
        Console.ReadKey()
    End Sub

    Public Class PKW
        Sub Einsteigen(ByVal Anzahl As Integer)
            Console.WriteLine("PKW - Parametertyp: Integer")
        End Sub

        Sub Einsteigen(ByVal Anzahl As Double)
            Console.WriteLine("PKW - Parametertyp: Double")
        End Sub
    End Class

    Public Class BMW
        Inherits PKW
        Overloads Sub Einsteigen(ByVal Anzahl As Double)
            Console.WriteLine("BMW - Parametertyp: Double")
        End Sub

        Overloads Sub Einsteigen(ByVal Anzahl As Integer)
            Console.WriteLine("BMW - Parametertyp: Integer")
        End Sub
    End Class

End Module
 

Neue Beiträge

Zurück