índice de vb.net

Constructores en VB.NET

y de paso, algunas cosillas más...

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 Namespace

Ahora 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 Namespace

Con 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


Ir al índice de vb.net

la Luna del Guille o... el Guille que está en la Luna... tanto monta...