Herencia de Clases


Introducción a la Herencia de Clases


La parte principal de la Programación Orientada a Objetos (POO) es la herencia de clases, es decir, la característica de definir una clase que sirva de base para otras clases derivadas, las clases derivadas tendran los miembros de la clase base: propiedades, métodos, eventos, etc.

Los miembros heredados por la clase derivada pueden sobre escribirse e implementarse de otra forma, además la clase derivada puede tener sus propios miembros y servir de clase base para otras clases, lográndose la reutilización de objetos a través de la herencia.

Otra forma de herencia es a través del polimorfismo, que es una característica de la POO que consiste en definir una clase abstracta con propiedades y métodos que serán implementados de diferentes formas por otras clases, es decir, con un mismo nombre de propiedad o método se obtiene funcionalidad distinta de acuerdo al tipo de objeto.

En .NET solo existe herencia simple y no herencia múltiple, es decir, una clase derivada solo puede heredar de una clase base. Haciendo una analogía, si a la clase base le llamamos “padre” y a la clase derivada le llamamos “hijo” diriamos que la herencia simple consiste en que un “hijo” solo puede tener un solo “padre”, lo que parece algo natural y coherente.

Si deseamos simular herencia múltiple en Visual Basic .NET recurrimos a las interfaces, que permiten definir propiedades y métodos en una clase sin código, luego desde una clase se puede implementar varias interfaces, lográndose una herencia múltiple pero a nivel de definición y no de código, ya que la implementación será distinta en cada clase.

En general, la herencia de clases permite reusar código y facilitar el mantenimiento de las aplicaciones, ya que cuando se desea modificar características de un objeto solo hay que cambiar la clase adecuada.

Con .NET podemos implementar la herencia de cualquier clase pública de la librería de clases base, la cual tiene una gran cantidad de clases de diferentes tipos, tales como Windows, Data, XML, ASP .NET, System, etc. Pero, también podemos implementar herencia de clases creadas por nosotros, sin importar el lenguaje en que fueron creadas.



Implementando Herencia en una Clase


Para crear una herencia de clases se usa la instrucción Inherits seguida de la clase base de donde se heredarán los miembros para la clase actual (clase derivada), tal como se muestra debajo.

Sintaxis:
Inherits <Clase Base>

Notas:
Dos observaciones importantes que hay que tener en cuenta son:
  1. La instrucción Inherits debe escribirse en la primera línea de la clase derivada.
  2. Solo puede existir una instrucción Inherits, ya que solo existe herencia simple.

Ejemplo:
Podemos crear una clase llamada “Vendedor” que herede de la clase “Empleado” que habíamos creado anteriormente, y crear dos propiedades, una llamada “Venta” y otra llamada “Comision”, tal como sigue:

Public Class Vendedor
Inherits Empleado
Private mvarVenta As Single
Private mvarComision As Single

Property Venta() As Single
Get
Venta = mvarVenta
End Get
Set(ByVal Value As Single)
mvarVenta = Value
End Set
End Property

Property Comision() As Single
Get
Comision = mvarComision
End Get
Set(ByVal Value As Single)
mvarComision = Value
End Set
End Property

End Class

Finalmente, la clase “Vendedor” tendrá
  • 5 propiedades: 3 heredadas: “Codigo”, “Nombre” y “Basico” y 2 propias: “Venta” y “Comision”.
  • 2 métodos heredados: “CrearEmpleado” y “ActualizarBasico”.
  • 2 eventos heredados: “BasicoBajo” y “BasicoAlto”.

Sentencias para trabajar con Herencia


Para trabajar con herencia de clases existen varias instrucciones que hay que conocer tanto a nivel de la clase como de sus miembros que definen las características de la herencia, las cuales explicamos a continuación.


Declaración de Clases Base


Para declarar una clase base existen varias formas que fueron vistas en temas anteriores, ahora afianzaremos solo los tipos de declaraciones que posibilitan o limitan el uso de herencia de una clase base:

  1. MustInherit
Permite crear una clase que solo sirva como clase base, es decir, que sirva solo para implementar herencia en otras clases, pero no podrá crearse objetos de esta clase.

Sintaxis:
MustInherit Class <Nombre Clase Base>
<Código de la clase>
End Class

  1. NotInheritable
Se usa para crear una clase que solo pueda crear objetos o aplicaciones clientes, pero que no pueda servir para heredarse en otra clase.

Sintaxis:
NotInheritable Class <Nombre Clase>
<Código de la clase>
End Class


SobreEscribiendo Propiedades y Métodos en Clases Derivadas


Para declarar una propiedad o método en una clase derivada o clase que hereda de una clase base, hay que tener ciertas consideraciones de acuerdo al tipo de declaración, que se explican a continuación.

  1. Overridable
Permite crear una propiedad o método que puede ser sobre escrito en una clase derivada. Esta declaración se hace en la propiedad o método de la clase base.

  1. Overrides
Se usa para sobre escribir una propiedad o método que fue definido como “Overridable” en la clase base. Esta declaración se hace en la propiedad o método de la clase derivada.

  1. NotOverridable
Impide que una propiedad o método pueda ser sobre escrito en una clase derivada. La definición se realiza en la propiedad o método de la clase base.
Por defecto, todas las propiedades o métodos públicos definidos en una clase base no pueden ser sobre escritos en la clase derivada.

  1. MustOverride
Permite crear una propiedad o método que será obligatorio sobre escribirlo en la clase derivada. Esta declaración se realiza en la propiedad o método de la clase base que ha sido definida como MustInherit.


Palabras claves MyBase y MyClass


Se puede usar las palabras clave MyBase y MyClass al trabajar con herencia, tal como se muestra a continuación:

  1. MyBase
Se usa para llamar a miembros de la clase base desde la clase derivada. Es decir en vez de usar el nombre de la clase seguido de la propiedad o método se usa la palabra clave MyBase seguida de la propiedad o método.

Este tipo de llamada es útil cuando se trabaja con métodos sobre escritos en una clase derivada y se necesita invocar al método de la clase base que será sobre escrito, tal como se muestra en el siguiente ejemplo.

Ejemplo:
Suponiendo que el método “CrearEmpleado” de la clase “Empleado” haya sido creado como “Overridable”, y se desea sobre escribir en la clase “Vendedor” para calcular correctamente el sueldo del vendedor incluyendo las comisiones, entonces, tendriamos lo siguiente:

Public Class Vendedor
Inherits Empleado

Public Overrides Sub CrearEmpleado(ByVal vCodigo As Integer, _
ByVal vNombre As String, ByVal vSueldo As Single)
vSueldo = vSueldo + mvarVenta * mvarComision
MyBase.CrearEmpleado(vCodigo,vNombre,vSueldo)
End Sub

End Class

  1. MyClass
Se usa para llamar a métodos sobre escribibles desde la clase derivada, y diferenciarlos de los métodos heredados desde la clase base.