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.

Polimorfismo


El polimorfismo consiste en la funcionalidad múltiple que puede tener un miembro de una clase para comportarse de diversas maneras de acuerdo al tipo de objeto que lo implemente.

Existen dos formas de implementar el polimorfismo en Visual Basic .NET:

  1. Polimorfismo basado en Herencia
Es una nueva forma de crear multiple funcionalidad para un método de una clase base que puede ser sobre escrito por otros métodos con el mismo nombre en las clases derivadas.

Ejemplo:
Tomemos como caso el ejemplo anterior donde habíamos sobre escrito el método “CrearEmpleado” de la clase “Empleado” modificandose en la clase derivada “Vendedor” para incluir lo recibido por comisiones de ventas. Crearemos el método llamado “MostrarSueldo” que permita crear el empleado y mostrar cuanto gana, usando el polimorfismo dependeiendo si es vendedor o no.

Sub MostrarSueldo(ByVal vEmpleado As Empleado, _
ByVal vCodigo As Integer, ByVal vNombre As String, _
ByVal vSueldo As Single)
vEmpleado.CrearEmpleado(vCodigo,vNombre,vSueldo)
MsgBox(vNombre & " gana s/. " & vSueldo)
End Sub

Sub ProbarPolimorfismo()
Dim objEmpleado As New Empleado
Dim objVendedor As New Vendedor
objEmpleado.CrearEmpleado(100, "Luis Dueñas", 1000)
objVendedor.Venta=1000
objVendedor.Comision=0.10
objVendedor.CrearEmpleado(100, "Luis Dueñas", 1000)
End Sub

En este ejemplo el resultado será para el primer caso el mensaje “Luis Dueñas gana 1000” y en el segundo caso el mensaje “Luis Dueñas gana 1100”.


  1. Polimorfismo basado en Interfaces
Este tipo de polimorfismo se usa también en Visual Basic 6 y consiste en crear una interface donde se definan nombres de propiedades y/o métodos, y luego se implementen con la sentencia “Implements” en varias clases, escribiendo diferentes códigos o implementaciones para las propiedades y métodos de cada clase.

Este último tipo de polimorfismo no se va a tratar, debido a que la manera natural de implementar polimorfismo es a través de la herencia de clases sobre escribiendo propiedades o métodos.

Introducción a Visual Studio .NET


En los módulos anteriores hemos tratado el Marco .NET y Visual Studio .NET, ahora trataremos Visual Basic .NET, pero hay que remarcar que las características del lenguaje dependen del Marco .NET y las herramientas son compartidas por el IDE de Visual Studio .NET

Visual Basic .NET es la versión 7 de ésta popular herramienta, ésta última versión tiene cambios radicales, tanto en su concepción (.NET), en el lenguaje, las herramientas usadas, etc. Entre las nuevas características de Visual Basic .NET tenemos:

  • Dos tipos de desarrollos bien diferenciados:

  • Aplicaciones para Windows


  • Aplicaciones para Internet

  • Acceso a Datos usando ADO .NET, el cual permite trabajar con DataSets desconectados

  • Nuevo Depurador que permite realizar seguimiento de código escrito en diferentes lenguajes .NET

  • Creación y uso de XML para intercambio de datos entre aplicaciones

  • Lenguaje Orientado a Objetos, con soporte de Herencia múltiple, y Polimorfismo a través de la sobrecarga de propiedades, métodos y funciones con el mismo nombre

  • Control de errores o excepciones en forma estructurada (Try..Catch..Finally)

  • Soporte de multithread para que la aplicación pueda ejecutar múltiples tareas en forma independiente.

  • Uso de NameSpaces para referirse a una clase que se va a usar en la aplicación. Los Assemblies reemplazan a la Librería de Tipos, en un Assemblie pueden existir uno o más NameSpaces

  • Reestructuración en los Tipos de Datos; existen nuevos tipos de datos y se han modificado y eliminado ciertos tipos de datos.

  • Cambio en el Lenguaje: nuevas forma de declarar variables, conversión explícita de tipos de datos (no existe conversión forzosa), no existen procedimientos sino funciones, etc.

Que es Visual Studio .NET

Visual Studio .NET es la Herramienta Rápida de Desarrollo (RAD) de Microsoft para la siguiente generación de Internet que son los Servicios Web XML. Esta herramienta permite la creación de aplicaciones usando el Marco .NET, es decir usando el CLR, la Librería de Clases, ADO .NET, ASP .NET, etc.

Es un software que brinda las herramientas necesarias para crear, distribuir, administrar y dar mantenimiento a aplicaciones Web distribuidas que usan Servicios Web XML, todo esto con una gran facilidad, rapidez y bajo costo.

Se puede crear aplicaciones Web directamente usando el Framework .NET y algún programa editor, por ejemplo el Bloc de Notas, pero el tiempo que llevaría el desarrollo no justificaría el ahorro de costos, en cambio, si se utiliza una herramienta como Visual Studio .NET el tiempo de desarrollo se reduciría enormemente.

Visual Studio .NET permite también la integración y el uso cruzado de lenguajes de programación: Visual Basic .NET, Visual C# .NET, Visual C++ .NET y JScript .NET

A diferencia de la versión anterior no existe Visual Interdev, ni Visual J++, además Visual Foxpro .NET no comparte las características unificadas del Marco .NET