En Visual Basic .NET, la herencia se implementa utilizando la palabra clave Inherits. Permite crear jerarquías de clases que implementan métodos y propiedades comunes y sobresalientes.
Para soportar el polimorfismo, los métodos en la clase base se declaran con el modificador Overridable, y en la clase derivada se sobrescriben utilizando Overrides. Para evitar la sobrescritura posterior, se utiliza el modificador NotOverridable.
Ejemplo:
' Clase base Animal con un método virtual Public Class Animal Public Overridable Sub Speak() Console.WriteLine("El animal hace un sonido.") End Sub End Class ' Heredero Dog sobrescribe Speak Public Class Dog Inherits Animal Public Overrides Sub Speak() Console.WriteLine("El perro ladra.") End Sub End Class Sub Main() Dim a As Animal = New Dog() a.Speak() ' Salida: El perro ladra. End Sub
P: ¿Se pueden sobrescribir métodos en Visual Basic .NET que no están declarados como Overridable/Abstract en la clase base?
R: No. Solo los métodos marcados como Overridable o declarados mediante una interfaz/abstracción pueden ser sobrescritos al heredar. Intentar usar Overrides para un método normal provocará un error de compilación.
' Error: Public Class A Public Sub Foo() End Sub End Class Public Class B Inherits A Public Overrides Sub Foo() ' Error de compilación End Sub End Class
Historia
1. En un proyecto real relacionado con una arquitectura de microservicios, un nuevo miembro del equipo declaró un método virtual como normal (sin Overridable) en la clase base del controlador. Más tarde, otro desarrollador intentó sobrescribir este método para un manejo especial. Como resultado, se produjo duplicación de lógica y errores, ya que la implementación del padre siempre se invocaba, a pesar de la presencia del método en el heredero.
Historia
2. Un diseño arquitectónico insuficiente y la falta de uso de polimorfismo llevaron a cientos de líneas de código redundante: al necesitar agregar un nuevo heredero, se tenía que reescribir gran parte del método de la clase base, en lugar de simplemente implementar el Override necesario. Esto complicó el mantenimiento y soporte.
Historia
3. Un caso de una aplicación corporativa: al migrar a .NET Core, un desarrollador marcó un método como Overridable, pero erróneamente no añadió Implements de la interfaz. Como resultado, se descubrió una ambigüedad en la resolución de métodos en la jerarquía de herencia y surgieron problemas al llamarlo a través de una referencia a la interfaz, lo que llevó a funcionalidades que no funcionaban.