VB.NET: Overloading, shadowing y overriding

Overloading: En general, hay overloading cuando dos o más métodos tienen el mismo nombre y devuelven lo mismo, pero los argumentos que reciben son diferentes en tipo y/o cantidad. Cuando nombre, tipo devuelto y argumentos coinciden, ello sólo puede ocurrir en clases diferentes para que no haya una definición duplicada. Si son clases sin relación, no hay problema. Pero si una hereda de otra, puede ocurrir Shadowing u Overriding.

Shadowing: Esto es lo que ocurre por defecto en VB.NET. Básicamente, dado un objeto, no se llama la definición dada por su tipo intrínseco, sino por el aparente. En otras palabras, no hay polimorfismo. Ejemplo:

Imports System
 
Public Class Base
    Public Sub ShadowedSub()
        Console.WriteLine("ShadowedSub:Base")
    End Sub
End Class
 
Public Class Derived : Inherits Base
    Public Sub ShadowedSub()
        Console.WriteLine("ShadowedSub:Derived")
    End Sub
End Class
 
Public Class Test
   Public Shared Sub Main() 
       Dim derived As New Derived
       derived.ShadowedSub()          'Derived
       Dim upcastedDerived As Base = New Derived()
       upcastedDerived.ShadowedSub()  '¡Base! No hay polimorfismo
   End Sub
End Class

Overriding: Para que el polimorfismo/mecanismo virtual funcione, debemos declarar al método como Overridable en Base y como Overrides en Derived. Le cambio el nombre a OverridenSub sólo por prolijidad, no era necesario.

Imports System
 
Public Class Base
    Public Overridable Sub OverridenSub()
        Console.WriteLine("OverridenSub:Base")
    End Sub
End Class
 
Public Class Derived : Inherits Base
    Public Overrides Sub OverridenSub()
        Console.WriteLine("OverridenSub:Derived")
    End Sub
End Class
 
Public Class Test
   Public Shared Sub Main() 
       Dim derived As New Derived
       derived.OverridenSub()          'Derived
       Dim upcastedDerived As Base = New Derived()
       upcastedDerived.OverridenSub()  'Derived, como cabe esperar
   End Sub
End Class

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

C++/CLI: Convert a String to BSTR or some other nasty stuff