Actualizado: 17/Oct/2000
En esta ocasión vamos a ver cómo se pueden "crear" constructores en vb.net.
Si ya te has leído lo publicado sobre el Win Forms Designer, recordarás que el procedimiento NEW de una clase se usaba como constructor de la clase.
Si la creación del objeto necesitara de unos parámetros de inicialización, éstos se indicarían en este procedimiento y el usuario que usara la clase, obligatoriamente tendría que proporcionar esos parámetros. Pero como, normalmente no es ese el caso, o al menos deberíamos dar la opción de poder crear el objeto sin necesidad de aportar ningún parámetro adicional, podemos usar la "sobrecarga" de procedimientos, para que, a la hora de crear el objeto se pudiera optar por aportar o no los parámetros, de esta forma, se usaría un procedimiento u otro, según se indicaran los parámetros o no...
Esto mismo se puede hacer con cualquier procedimiento, no sólo con el constructor.
Hasta ahora se utilizaban los parámetros opcionales para permitir al usuario aportar todos los parámetros que dicho procedimiento necesita o sólo los que quisiera modificar, por defecto esos parámetros suelen tener unos valores predeterminados... aunque esto seguramente lo veremos en otra ocasión. Vamos a centrarnos en lo que el título de esta página indica.El código que vamos a usar, consistirá en crear una clase, modificada de uno de los ejemplos proporcionados en el SDK, la cual tendrá dos propiedades y un método.
Las propiedades servirán para asignar un nombre y el saludo, el método devolverá una cadena con el saludo y el nombre indicados.
Además crearemos un formulario de prueba, en el cual insertaremos unos cuantos controles como una caja de texto, dos etiquetas, un par de botones y un checkbox. Este último nos permitirá poder seleccionar si usaremos la clase con el constructor predeterminado (sin parámetros) o si usaremos un parámetro para indicar el tipo de saludo a emitir, si no se le indica nada será la palabra HELLO y si se le indica, usaré el que digamos.
Veamos el código de la clase.
Este será el código a usar, en los comentarios están las explicaciones necesarias, el resto lo puedes "intuir", sobre todo si te has leído el mencionado artículo sobre el uso del diseñador de formularios.' '------------------------------------------------------------------------------ ' Ejemplo de constructor en VB.NET (16/Oct/00) ' ' ©Guillermo 'guille' Som, 2000 '------------------------------------------------------------------------------ Imports System Namespace Ejemplos.HelloWorldConstructor Public Class HelloWorldVB ' Variables privadas Private _name As String ' Variable para guardar el nombre Private _Hello As String = "Hello" ' Variable para guardar el saludo ' Si se incluye el parámetro ' Overloads permite la sobrecarga del procedimiento New Overloads Public Sub New(Byval sHello As String) ' MyBase.New() siempre debe estar en el constructor MyBase.New() ' Se llama a un procedimiento interno en el que se asignarán otros valores Constructor ' Asignamos a la variable que contendrá el saludo _Hello = sHello End Sub ' Si no se incluye el parámetro Overloads Public Sub New() ' MyBase.New() siempre debe estar en el constructor MyBase.New() Constructor End Sub ' En este procedimiento se asignarán otros valores ' es como si fuese el Class_Initialize de las versiones anteriores Private Sub Constructor() _name = "" End Sub ' La Propiedad Nombre Public Property Nombre As String ' Esta parte será la que devuelva el nombre Get ' devuelve el contenido de la variable del nombre Return _name End Get ' Esta parte es la que asigna el valor a la variable del nombre Set _name = Value End Set End Property ' La Propiedad Saludo Public Property Saludo As String ' GET es la parte que devuelve el saludo Get ' devuelve el contenido de la variable del saludo Return _Hello End Get ' SET es la parte que asigna el valor a la variable del saludo Set _Hello = Value End Set End Property ' Este será el método para mostrar el saludo Public Function SayHello() As String ' Declaramos la variable s y asignamos un valor Dim s As String = _Hello & " " ' Esto es lo mismo que esto otro: ' Dim s As String ' s = _Hello & " " ' ' Si el contenido de _name no está vacio If Not (_name = "") s = s & _name Else ' si no se ha indicado un nombre, se usa la palabra WORLD s = s & "World" End If s = s & "!" ' Devolvemos el contenido de s Return s End Function End Class End NamespaceAhora el código del form de ejemplo.
Y este es el código de formulario con el que vamos a probar la clase creada anteriormente.
Nota: Los comentarios en inglés son los que incluye el diseñador de formularios.' '------------------------------------------------------------------------------ ' Ejemplo de constructor en VB.NET (16/Oct/00) ' ' ©Guillermo 'guille' Som, 2000 '------------------------------------------------------------------------------ Imports System Imports System.ComponentModel Imports System.Drawing Imports System.WinForms ' Incluimos una referencia a nuestra clase Imports Ejemplos.HelloWorldConstructor Namespace Ejemplos.HelloWorldConstructor_Test Public Class HelloWorldConstructor_Test ' Heredamos la funcionalidad de los formularios Inherits System.WinForms.Form 'Required by the Win Forms Designer Private components As System.ComponentModel.Container Private CheckBox1 As System.WinForms.CheckBox Private cmdSalir As System.WinForms.Button Private Label2 As System.WinForms.Label Private cmdOk As System.WinForms.Button Private TextBox1 As System.WinForms.TextBox Private Label1 As System.WinForms.Label ' El constructor del formulario Public Sub New() MyBase.New 'This call is required by the Win Forms Designer. InitializeComponent End Sub ' El destructor del formulario 'Clean up any resources being used Overrides Public Sub Dispose() MyBase.Dispose components.Dispose End Sub 'The main entry point for the application Shared Sub Main() Application.Run(New HelloWorldConstructor_Test()) End Sub 'NOTE: The following procedure is required by the Win Forms Designer 'Do not modify it. Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container Me.cmdSalir = New System.WinForms.Button Me.cmdOk = New System.WinForms.Button Me.CheckBox1 = New System.WinForms.CheckBox Me.Label2 = New System.WinForms.Label Me.Label1 = New System.WinForms.Label Me.TextBox1 = New System.WinForms.TextBox ' El botón Salir con la declaración del evento, etc. cmdSalir.Location = New System.Drawing.Point(204, 160) cmdSalir.Size = New System.Drawing.Size(75, 23) cmdSalir.TabIndex = 4 cmdSalir.Text = "Salir" cmdSalir.AddOnClick(New System.EventHandler(AddressOf Me.cmdSalir_Click)) ' El botón Aceptar y la declaración del evento cmdOk.Location = New System.Drawing.Point(204, 40) cmdOk.Size = New System.Drawing.Size(75, 23) cmdOk.TabIndex = 2 cmdOk.Text = "Aceptar" cmdOk.AddOnClick(New System.EventHandler(AddressOf Me.cmdOk_Click)) Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.Text = "Ejemplos: HelloWorld con Constructor" '@design Me.TrayLargeIcon = True ' El formulario será de borde fijo y no tendrá botón de maximizar Me.BorderStyle = System.WinForms.FormBorderStyle.FixedSingle Me.MaximizeBox = False '@design Me.TrayHeight = 0 Me.ClientSize = New System.Drawing.Size(290, 195) '@design Me.GridSize = New System.Drawing.Size(4, 4) ' ' El botón predeterminado (cuando se pulsa Intro) Me.AcceptButton = cmdOk ' El botón de cancelar (cuando se pulsa Esc) Me.CancelButton = cmdSalir CheckBox1.Checked = True CheckBox1.Location = New System.Drawing.Point(12, 80) CheckBox1.Text = "Usar el constructor con parámetros " CheckBox1.Size = New System.Drawing.Size(204, 16) CheckBox1.CheckState = System.WinForms.CheckState.Checked CheckBox1.AccessibleRole = System.WinForms.AccessibleRoles.CheckButton CheckBox1.TabIndex = 5 CheckBox1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft Label2.Location = New System.Drawing.Point(8, 120) Label2.Text = "Label2" Label2.Size = New System.Drawing.Size(272, 16) Label2.BorderStyle = System.WinForms.BorderStyle.Fixed3D Label2.TabIndex = 3 Label1.Location = New System.Drawing.Point(8, 16) Label1.Text = "Nombre:" Label1.Size = New System.Drawing.Size(52, 16) Label1.TabIndex = 0 TextBox1.Location = New System.Drawing.Point(60, 12) TextBox1.Text = "" TextBox1.TabIndex = 1 TextBox1.Size = New System.Drawing.Size(220, 20) Me.Controls.Add(CheckBox1) Me.Controls.Add(cmdSalir) Me.Controls.Add(Label2) Me.Controls.Add(cmdOk) Me.Controls.Add(TextBox1) Me.Controls.Add(Label1) End Sub Protected Sub cmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ' Salir del programa Me.Close End Sub Protected Sub cmdOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ' Evento Click del botón Aceptar ' ' Si se usa el constructor con parámetros: 'Dim hwDll As New Ejemplos.HelloWorldConstructor.HelloWorldVB("¡Hola") ' como hemos usado Imports, no es necesrio indicarle tantas cosas... 'Dim hwDll As New HelloWorldVB("¡Hola") ' ' Creamos un objeto sin parámetros ' al cual asignaremos otro objeto creado con y sin cosntructor Dim hwDll As New HelloWorldVB() ' ' Declararla con o sin constructor, dependiendo de lo elegido ' aunque hay que usar una segunda variable... If CheckBox1.Checked Then ' Esta variable sólo está disponible en este IF ' la creamos con el contructor que recibe un parámetro Dim hwDll2 As New HelloWorldVB("¡Hola") hwDll = hwDll2 Else ' y esta en el Else... ' la creamos con el constructor que no recibe parámetros Dim hwDll2 As New HelloWorldVB() hwDll = hwDll2 End If ' Aquí no "llega" la visibilidad de hwDll2, ' si se usa esa variable, el compilador nos daría el error: ' The name 'hwDll2' is not declared. 'hwDll = hwDll2 With hwDll .Nombre = TextBox1.Text Label2.Text = .SayHello() End With End Sub End Class End NamespaceCon estos ejemplos hemos visto:
-cómo "sobrecargar" un procedimiento, en este caso el constructor de una clase,
-cómo codificar propiedades y métodos en una clase,
-cómo usar variables "internas" a un bloque de código, en este ejemplo: dentro de un IF...THEN...ELSE,
-cómo compilar en un ejecutable un formulario y una clase.
Para compilar este ejemplo haríamos lo siguiente: (suponiendo que estamos en el directorio en el que se encuentran las dos clases)
vbc HelloWorldConstructor.vb HelloWorldConstructor_Test.vb /r:System.dll /r:system.winforms.dll /r:System.Drawing.dll
Hasta aquí hemos llegado... confío que este ejemplo te sirva para clarificar y/o mostrar algunas de las nuevas características del vb.net
Como último comentario, (el que te encontrarás en todos los temas relacionados con la nueva versión de Visual Basic), decirte que sigas atento, ya que en breve publicaré más ejemplos...
Nos vemos.
Guillermo