Objetos y clases de Visual Basic

Un objeto es una combinación de código y datos que se pueden tratar como una unidad. Un objeto puede ser una parte de una aplicación, como un control o un formulario. Toda la aplicación también puede ser un objeto.

Cuando se crea una aplicación en Visual Basic, se trabaja constantemente con objetos. Puede usar los objetos que proporciona Visual Basic, como controles, formularios y objetos de acceso a datos. También puede usar objetos de otras aplicaciones dentro de la aplicación de Visual Basic. Incluso puede crear sus propios objetos y definir propiedades y métodos adicionales para ellos. Los objetos actúan como bloques de compilación prefabricados que permiten escribir un fragmento de código de una vez y utilizarlo una y otra vez.

En este tema se proporciona información detallada sobre los objetos.

Objetos y clases

Cada objeto de Visual Basic se define mediante una clase. Una clase describe las variables, las propiedades, los procedimientos y los eventos de un objeto. Los objetos son instancias de clases; puede crear tantos objetos como sean necesarios una vez que haya definido una clase.

Para comprender la relación entre un objeto y su clase, piense en las galletas y en su molde. El molde de la galleta es la clase. Define las características de cada galleta, por ejemplo, tamaño y forma. La clase se usa para crear objetos. Los objetos son las galletas.

Debe crear un objeto para poder acceder a sus miembros, excepto para los miembros Shared, a los que se puede acceder sin un objeto de la clase.

Creación de un objeto a partir de una clase

  1. Determine a partir de qué clase quiere crear un objeto o defina su propia clase. Por ejemplo:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Escriba una instrucción Dim para crear una variable a la que pueda asignar una instancia de clase. La variable debe ser del tipo de la clase deseada.

    Dim nextCustomer As Customer
    
  3. Agregue la palabra clave Nuevo operador para inicializar la variable en una nueva instancia de la clase.

    Dim nextCustomer As New Customer
    
  4. Ahora puede tener acceso a los miembros de la clase a través de la variable de objeto.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Nota

Siempre que sea posible, debe declarar la variable para que sea del tipo de clase al que pretende asignarla. Esto se denomina enlace anticipado. Si no conoce el tipo de clase en tiempo de compilación, puede invocar el enlace en tiempo de ejecución mediante la declaración de la variable para que sea del tipo de datos de objeto. Sin embargo, el enlace en tiempo de ejecución puede ralentizar el rendimiento y limitar el acceso a los miembros del objeto de tiempo de ejecución. Para más información, vea Declaración de variables de objeto.

Varias instancias

Los objetos recién creados a partir de una clase suelen ser idénticos entre sí. Una vez que existen como objetos individuales, sin embargo, sus variables y propiedades se pueden cambiar independientemente de las otras instancias. Por ejemplo, si agrega tres casillas a un formulario, cada objeto de casilla es una instancia de la clase CheckBox. Los objetos CheckBox individuales comparten un conjunto común de características y funciones (propiedades, variables, procedimientos y eventos) que define la clase. Sin embargo, cada uno tiene su propio nombre, pueden habilitarse y deshabilitarse por separado y se pueden colocar en una ubicación distinta en el formulario.

Miembros de objetos

Un objeto es un elemento de una aplicación, que representa una instancia de una clase. Los campos, las propiedades, los métodos y los eventos son los bloques de compilación de objetos y constituyen sus miembros.

Acceso a miembros

Para acceder al miembro de un objeto, especifique, en este mismo orden, el nombre de la variable de objeto, un punto (.) y el nombre del miembro. En el ejemplo siguiente se establece la propiedad Text de un objeto Label.

warningLabel.Text = "Data not saved"

Lista de miembros de IntelliSense

IntelliSense muestra los miembros de una clase cuando invoca su opción Lista de miembros, por ejemplo, al escribir un punto (.) como un operador de acceso a miembros. Si escribe el punto después del nombre de una variable declarada como una instancia de esa clase, IntelliSense muestra todos los miembros de instancia y ningún miembro compartido. Si escribe el punto después del nombre de clase, IntelliSense muestra todos los miembros compartidos y ningún miembro de instancia. Para obtener más información, vea Usar IntelliSense.

Campos y propiedades

Los campos y las propiedades representan información almacenada en un objeto. Puede recuperar y establecer sus valores con instrucciones de asignación de la misma forma en que se recuperan y establecen las variables locales en un procedimiento. En el ejemplo siguiente se recupera la propiedad Width y se establece la propiedad ForeColor de un objeto Label.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Tenga en cuenta que a un campo también se le denomina variable de miembro.

Use procedimientos de propiedad cuando:

  • Necesite controlar cuándo y cómo se establece o recupera un valor.

  • La propiedad tiene un conjunto bien definido de valores que precisan de validación.

  • La configuración del valor genera algún cambio perceptible en el estado del objeto, como una propiedad IsVisible.

  • La configuración de la propiedad provoca cambios en otras variables internas o en los valores de otras propiedades.

  • Es necesario realizar una serie de pasos antes de que la propiedad se pueda establecer o recuperar.

Utilice campos cuando:

  • El valor sea de un tipo de autovalidación. Por ejemplo, se produce un error o una conversión de datos automática si un valor distinto de True o False se asigna a una variable Boolean.

  • Cualquier valor del intervalo admitido por el tipo de datos es válido. Esto mismo sucede con muchas propiedades del tipo Single o Double.

  • La propiedad es un tipo de datos String, y no hay ninguna restricción del tamaño o el valor de la cadena.

  • Para más información, vea Procedimientos de propiedad.

Sugerencia

Mantenga siempre privados los campos que no son constantes. Cuando quiera hacerlos públicos, use una propiedad.

Métodos

Un método es una acción que un objeto puede realizar. Por ejemplo, Add es un método del objeto ComboBox que agrega una entrada nueva al cuadro combinado.

En el ejemplo siguiente se muestra el método Start de un objeto Timer.

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Tenga en cuenta que un método es simplemente un procedimiento que se expone mediante un objeto.

Para más información, vea Procedimientos en Visual Basic.

Events

Un evento es una acción reconocida por un objeto, como hacer clic con el ratón o presionar una tecla, para la que puede escribir código para que responda. Los eventos pueden producirse como resultado de una acción del usuario o código de programa, o puede provocarlos el sistema. Se dice que el código que señala un evento genera el evento y el código que responde a él se dice que lo controla.

También puede desarrollar sus propios eventos personalizados para que los generen sus objetos y los controlen otros objetos. Para más información, vea Eventos.

Miembros de instancia y miembros compartidos

Cuando se crea un objeto de una clase, el resultado es una instancia de esa clase. Los miembros no declarados con la palabra clave Shared son miembros de instancia, que pertenecen estrictamente a esa instancia concreta. Un miembro de instancia en una instancia es independiente del mismo miembro en otra instancia de la misma clase. Por ejemplo, una variable de miembro de instancia puede tener valores diferentes en instancias distintas.

Los miembros declarados con la palabra clave Shared son miembros compartidos, que pertenecen a la clase como un todo y no a una instancia determinada. Un miembro compartido existe solo una vez, independientemente del número de instancias de su clase, o incluso si no crea ninguna. Una variable de miembro compartido, por ejemplo, tiene un único valor, que está disponible para todo el código que puede tener acceso a la clase.

Acceso a miembros no compartidos

  1. Asegúrese de que el objeto se crea a partir de su clase y de que se asigna a una variable de objeto.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. En la instrucción que tiene acceso al miembro, coloque detrás del nombre de la variable de objeto el operador de acceso a miembro (.) y, a continuación, el nombre del miembro.

    secondForm.Show()
    

Acceso a miembros compartidos

  • Coloque detrás el nombre de clase el operador de acceso a miembro (.) y, a continuación, el nombre del miembro. Siempre debe acceder a un miembro Shared del objeto directamente a través del nombre de clase.

    Console.WriteLine("This computer is called " & Environment.MachineName)
    
  • Si ya ha creado un objeto de la clase, también puede acceder a un miembro Shared a través de la variable del objeto.

Diferencias entre clases y módulos

La diferencia principal entre clases y módulos es que pueden crearse instancias de clases como objetos, pero no de los módulos estándar. Como solo hay una copia de los datos de un módulo estándar, cuando una parte del programa cambia una variable pública en un módulo estándar, cualquier otra parte del programa obtiene el mismo valor si lee luego esa variable. En cambio, los datos de objeto existen por separado para cada objeto con instancias. Otra diferencia es que, a diferencia de los módulos estándar, las clases pueden implementar interfaces. Si una clase está marcada con el modificador MustInherit, no se puede crear una instancia de ella directamente. Aun así, es diferente de un módulo, ya que se puede heredar, mientras que los módulos no se pueden heredar.

Nota

Cuando el modificador Shared se aplica a un miembro de clase, se asocia a la propia clase, en lugar de a una instancia particular de una clase. Al miembro se accede directamente con el nombre de clase, de la misma forma que se accede a los miembros del módulo.

Las clases y los módulos también emplean ámbitos diferentes para sus miembros. Los miembros definidos dentro de una clase tienen el ámbito de una instancia específica de la clase y solo durante la vigencia del objeto. Para acceder a miembros de clase desde fuera de una clase, debe utilizar nombres completos con el formato de Objeto.Miembro.

Por otro lado, los miembros declarados dentro de un módulo son de acceso público de forma predeterminada a través de cualquier código que pueda tener acceso al módulo. Esto significa que las variables de un módulo estándar son variables globales porque son visibles desde cualquier parte del proyecto y, además, existen durante la vigencia del programa.

Reutilización de clases y objetos

Los objetos permiten declarar variables y procedimientos una vez, para luego reutilizarlos siempre que sea necesario. Por ejemplo, si desea agregar un corrector ortográfico a una aplicación, podría definir todas las variables y funciones compatibles para proporcionar la funcionalidad de revisión ortográfica. Si crea el corrector ortográfico como una clase, puede reutilizarlo en otras aplicaciones mediante la incorporación de una referencia al ensamblado compilado. Mejor aún, puede ahorrarse trabajo mediante el uso de una clase de corrector ortográfico que otra persona ya ha desarrollado.

.NET proporciona muchos ejemplos de componentes que están disponibles para su uso. En el ejemplo siguiente se usa la clase TimeZone en el espacio de nombres System. TimeZone proporciona miembros que permiten recuperar información sobre la zona horaria del equipo actual.

Public Sub ExamineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
    Console.WriteLine(s)
End Sub

En el ejemplo anterior, la primera instrucción Dim declara una variable de objeto del tipo TimeZone y le asigna un objeto TimeZone que devuelve la propiedad CurrentTimeZone.

Relaciones entre objetos

Los objetos pueden relacionarse entre sí de varias maneras. Los tipos principales de relación son jerárquica y de contención.

Relación jerárquica

Cuando las clases se derivan de clases más fundamentales, se dice que tienen una relación jerárquica. Las jerarquías de clases son útiles cuando se describen elementos que constituyen un subtipo de una clase más general.

En el ejemplo siguiente, suponga que quiere definir un tipo especial de Button que actúa como un Button normal, pero también expone un método que invierte los colores de primer plano y de fondo.

Definición de una clase derivada de una clase ya existente

  1. Use una instrucción Class para definir una clase desde la que crear el objeto que necesita.

    Public Class ReversibleButton
    

    Asegúrese de que una instrucción End Class sigue a la última línea de código de la clase. De forma predeterminada, el entorno de desarrollo integrado (IDE) genera automáticamente End Class al escribir una instrucción Class.

  2. Siga a la instrucción Class inmediatamente con una instrucción Inherits. Especifique la clase de la que deriva la nueva clase.

    Inherits System.Windows.Forms.Button
    

    La nueva clase hereda todos los miembros definidos por la clase base.

  3. Agregue el código para los miembros adicionales que la clase derivada expone. Por ejemplo, puede agregar un método ReverseColors y la clase derivada podría tener el aspecto siguiente:

    Public Class ReversibleButton
        Inherits System.Windows.Forms.Button
            Public Sub ReverseColors()
                Dim saveColor As System.Drawing.Color = Me.BackColor
                Me.BackColor = Me.ForeColor
                Me.ForeColor = saveColor
           End Sub
    End Class
    

    Si crea un objeto a partir de la clase ReversibleButton, este puede acceder a todos los miembros de la clase Button, así como al método ReverseColors y a todos los miembros nuevos que defina en ReversibleButton.

Las clases derivadas heredan miembros de la clase en que se basan, lo que permite agregar complejidad a medida que progresa en una jerarquía de clases. Para más información, vea Fundamentos de la herencia.

Compilar el código

Asegúrese de que el compilador puede tener acceso a la clase de la que pretende derivar la nueva clase. Esto puede conllevar su nombre completo, como en el ejemplo anterior, o la identificación de su espacio de nombres en una Instrucción Imports (Tipo y espacio de nombres de .NET). Si la clase está en un proyecto diferente, tendrá que agregar una referencia a ese proyecto. Para más información, vea Administrar referencias en un proyecto.

Relaciones de contención

Otra forma de relacionar ese objeto es mediante una relación de contención. Los objetos contenedores lógicamente encapsulan otros objetos. Por ejemplo, el objeto OperatingSystem contiene lógicamente un objeto Version, el cual devuelve a través de su propiedad Version. Tenga en cuenta que el objeto contenedor no contiene ningún otro objeto físicamente.

Colecciones

Un tipo concreto de contención de objeto se representa mediante colecciones. Las colecciones son grupos de objetos similares que se pueden enumerar. Visual Basic admite una sintaxis específica en la instrucción For Each...Next que le permite iterar por los elementos de una colección. Además, las colecciones suelen permitir usar un Item[] para recuperar elementos en función de su índice o asociándolos con una cadena única. Las colecciones pueden ser más fáciles de utilizar que las matrices puesto que permiten agregar o quitar elementos sin utilizar índices. Debido a su facilidad de uso, las colecciones se utilizan a menudo para almacenar formularios y controles.

Tutorial: Definir clases
Proporciona una descripción detallada sobre cómo crear una clase.

Propiedades y métodos sobrecargados
Propiedades y métodos sobrecargados

Fundamentos de la herencia
Se tratan los modificadores de herencia, con la sustitución de métodos y propiedades, MyClass y MyBase.

Duración de los objetos: cómo se crean y destruyen
Describe cómo crear y eliminar instancias de clase.

Tipos anónimos
Describe cómo crear y usar tipos anónimos que permiten crear objetos sin escribir una definición de clase para el tipo de datos.

Inicializadores de objeto: tipos con nombre y anónimos
Explica los inicializadores de objeto, que se usan para crear instancias de tipos con nombre y anónimos mediante una sola expresión.

Procedimiento para deducir tipos y nombres de propiedades en declaraciones de tipos anónimos
Explica cómo deducir tipos y nombres de propiedades en declaraciones de tipos anónimos. Proporciona ejemplos de inferencia correcta e incorrecta.