Herencia en Visual Basic .Net - IImplementación de un formulario PlantillaFecha: 29/Oct/2005 (26 de Octubre de 2005)
|
Sres. Desarrolladores, en esta oportunidad comparto con ustedes un ejemplo práctico y pequeño sobre Herencia, la idea del artículo es dar a conocer como implementar herencia, si bien este ejemplo es simple les puede dar la idea de como implementar otros mas complicados,
ALGO DE TEORIA
Visual Basic.Net es compatible con la herencia, la capacidad de definir clases que sirvan como base para las clases derivadas. Las clases derivadas heredan, y pueden extender, las propiedades, métodos y eventos de la clase base. Las clases derivadas también pueden reemplazar métodos heredados con nuevas implementaciones. De forma predeterminada, todas las clases creadas con Visual Basic .NET se pueden heredar.
La herencia permite escribir y depurar una clase una vez, y después volver a utilizar ese código una y otra vez como base de nuevas clases. La herencia también permite utilizar el polimorfismo basado en la herencia, la posibilidad de definir clases que pueden utilizarse de forma intercambiable mediante código cliente en tiempo de ejecución, pero con funcionalidad diferente, incluyo con métodos o propiedades denominados de manera idéntica.
La instrucción Inherits
La instrucción Inherits se utiliza para declarar una nueva clase, denominada clase derivada, basada en una clase existente conocida como clase base. Las clases derivadas heredan, y pueden extender, las propiedades, métodos, eventos, campos y constantes definidos en la clase base. En la siguiente sección se describen algunas de las reglas de herencia, así como los modificadores que se pueden utilizar para cambiar la forma en que las clases heredan o son heredadas:
De forma predeterminada, todas las clases son heredables a menos que se marquen con la palabra clave NotInheritable. Las clases pueden heredar de otras clases del proyecto o de clases en otros ensamblados a los que hace referencia el proyecto. A diferencia de los lenguajes que permiten la herencia múltiple, Visual Basic .NET sólo permite la herencia simple en las clases; es decir, las clases derivadas sólo pueden tener una clase base. Aunque no se permite la herencia múltiple en las clases, éstas pueden implementar múltiples interfaces, lo que permite lograr de manera eficaz los mismos fines. Para evitar la exposición de elementos restringidos en una clase base, el tipo de acceso de una clase derivada debe ser igual o más restrictivo que el de su clase base. Por ejemplo, una clase Public no puede heredar una clase Friend o Private, y una clase Friend no puede heredar una clase Private.Modificadores de herencia
Visual Basic .Net presenta las siguientes instrucciones y modificadores de nivel de clase para ofrecer compatibilidad con la herencia:
Instrucción Inherits: especifica la clase base. Modificador NotInheritable: impide que los programadores utilicen la clase como clase base. Modificador MustInherit: especifica que la clase sólo se debe utilizar como clase base. Las instancias de las clases MustInherit no se pueden crear directamente; sólo se pueden crear como instancias de clase base de una clase derivada. Otros lenguajes de programación, como C++ y C#, utilizan el término clase abstracta para describir tal clase.Reemplazar propiedades y métodos en clases derivadas
De forma predeterminada, una clase derivada hereda métodos de su clase base. Si una propiedad o método heredado debe comportarse de forma diferente en la clase derivada, puede ser reemplazado; es decir, puede definirse una nueva implementación del método en la clase derivada. Los siguientes modificadores se utilizan para controlar cómo se reemplazan propiedades y métodos:
Overridable: permite reemplazar una propiedad o un método de una clase en una clase derivada. Overrides: reemplaza una propiedad o un método Overridable definido en la clase base. NotOverridable: impide reemplazar una propiedad o método en una clase que hereda. Los métodos Public son NotOverridable de manera predeterminada. MustOverride: requiere que una clase derivada reemplace una propiedad o un método. Cuando se utiliza la palabra clave MustOverride, la definición del método consiste simplemente en la instrucción Sub, Function o Property. No se permite ninguna otra instrucción y, específicamente, no existe ninguna instrucción End Sub ni End Function. Los métodos MustOverride deben declararse en las clases MustInherit.La palabra clave MyBase
Puede utilizar la palabra clave MyBase para llamar a métodos de una clase base cuando reemplace métodos en una clase derivada. Por ejemplo, suponga que diseña una clase derivada que reemplaza un método heredado de la clase base. El método reemplazado puede llamar al método de la clase base y modificar el valor devuelto como se muestra en el fragmento de código siguiente:
Class DerivedClass Inherits BaseClass Public Overrides Function CalcularPago(ByVal Dist As Double, _ ByVal Rate As Double) As Double ' Llama al método de la Clase Base y retorna el Valor Return MyBase.CalcularPago(Dist, Rate) * 2 End Function End ClassEn la lista siguiente se describen las restricciones de uso de MyBase:
MyBase hace referencia a la clase base inmediata y a sus miembros heredados. No se puede utilizar para tener acceso a miembros Private de la clase. MyBase es una palabra clave, no un objeto real. MyBase no se puede asignar a una variable, pasar a procedimientos ni utilizar en una comparación Is. No es necesario definir el método al que califica MyBase en la clase base inmediata; puede definirse en una clase base heredada indirectamente. Para compilar correctamente una referencia calificada mediante MyBase, alguna clase base debe contener un método correspondiente al nombre y el tipo de los parámetros que aparezcan en la llamada. No puede utilizar MyBase para llamar a métodos de clase base con el modificador MustOverride. No se puede utilizar MyBase para calificarse a sí misma. Por tanto, el siguiente código no es válido: MyBase.MyBase.BtnOK_Click() ' Syntax error. No se puede utilizar MyBase en módulos. No se puede utilizar MyBase para tener acceso a miembros de clase base marcados como Friend si la clase base está en un ensamblado diferente.La palabra clave MyClass
La palabra clave MyClass permite llamar a un método Overridable implementado en la clase y asegurarse de que se llama a la implementación del método en esta clase y no a la de un método reemplazado en una clase derivada.
MyClass es una palabra clave, no un objeto real. No se puede asignar a una variable, pasar a procedimientos ni utilizar en una comparación Is. MyClass hace referencia a la clase base inmediata y a sus miembros heredados. MyClass puede utilizarse como calificador de miembros Shared. MyClass no se puede utilizar en módulos estándar. MyClass puede utilizarse para calificar un método que está definido en un clase base y que no tiene ninguna implementación del método proporcionado en esa clase. Tal referencia tiene el mismo significado que MyBase.Method.Fuente: MSDN Library de Visual Studio .Net 2003
EL EJEMPLO
El formulario Base llamado frmPlantilla tiene el siguiente diseño:
En la clase base se ha creado una función con el siguiente código:
Protected Function CrearDataSet() As DataSet Try Dim cn As New SqlConnection("user id=sa;initial catalog=Northwind;persist security info=False") Dim daClientes As New SqlDataAdapter("Select CustomerId,CompanyName,ContactName, Address from Customers", cn) Dim dsDatos As New DataSet daClientes.Fill(dsDatos, "Clientes") Return dsDatos Catch Ex As Exception MessageBox.Show("Error: " & Ex.Message) End End Try End Function
La clase heredada, que es otro formulario tiene el siguiente diseño:
A continuación sigue código en Visual Basic:
Al cargar el formulario heredado
Private Sub CargarConGrid(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load lblTitulo.Text = "Clientes - Herencia en Visual Basic .Net" 'Especificar el origen del Grid 'La función: CrearDataSet se encuentra en el 'formulario frmPlantilla que es del cual se hereda dgClientes.DataSource = CrearDataSet.Tables("Clientes") dgClientes.CaptionText = "Clientes Registrados" 'Darle formato al Grid FormatearGrid() End Sub
Note en la porción de código anterior la línea:
dgClientes.DataSource = CrearDataSet.Tables("Clientes")
en esta instrucción se ejecuta la función CrearDataSet implementada en la clase Base.La línea de definición de la clase derivada es como sigue:
Public Class frmClientesGrid Inherits VBHerencia.frmPlantillaLos pasos para crear un formulario heredado son los siguientes:
1. Botón derecho en el Proyecto, seleccionar Agregar, luego Agregar formulario heredado... se muestra lo siguiente:
2. Escribir el nombre del formulario heredado y pulsar click en Abrir
3. Seleccionar el objeto (formulario) del cual se heredará y pulsar click en Aceptar
Al crearse el formulario heredado para nuestro ejemplo aparece con el siguiente diseño visto desde el IDE, en este hemos insertado un Grid, note los identificadores de los controles que pertenecen a la clase Base.
Para terminar con el ejemplo, formateamos el Grid con el siguiente procedimiento
Private Sub FormatearGrid() Dim EstiloTabla As New DataGridTableStyle With EstiloTabla .AlternatingBackColor = Color.LightCyan .BackColor = Color.LightYellow .ForeColor = Color.DarkGreen .GridLineColor = Color.Chocolate .GridLineStyle = System.Windows.Forms.DataGridLineStyle.None .HeaderBackColor = Color.MidnightBlue .HeaderFont = New Font("Times New Roman", 8.0!, FontStyle.Bold) .HeaderForeColor = Color.White .MappingName = "Clientes" End With ' Formato para las columnas Dim Col01 As New DataGridTextBoxColumn With Col01 .HeaderText = "Id. Cliente " .MappingName = "CustomerID" .Width = 70 End With Dim Col02 As New DataGridTextBoxColumn With Col02 .HeaderText = "Compañía" .MappingName = "CompanyName" .Width = 200 End With Dim Col03 As New DataGridTextBoxColumn With Col03 .HeaderText = "Contacto" .MappingName = "ContactName" .Width = 150 End With Dim Col04 As New DataGridTextBoxColumn With Col04 .HeaderText = "Dirección" .MappingName = "Address" .Width = 180 End With 'Añadir los estilos de columnas al estiloTabla EstiloTabla.GridColumnStyles.AddRange _ (New DataGridColumnStyle() _ {Col01, Col02, Col03, Col04}) 'Añadir el estilo al Grid dgClientes.TableStyles.Add(EstiloTabla) End SubRespecto al formateo de Grid pueden visitar:
http://www.elguille.info/colabora/NET2005/FernandoLuque_FormateandoDataGrid.htm
Ing. Fernando Luque Sánchez
De Trujillo - Perú para el mundo entero
Espacios de nombres usados en el código de este artículo:
System.Data
System.Data.SQLClient
Fichero con el código de ejemplo: FernandoLuque_HerenciaNetI.zip - (10) KB