Compartir a través de


Objetos y clases en 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. Una aplicación completa también puede ser un objeto .

Al crear una aplicación en Visual Basic, se trabaja constantemente con objetos. Puede usar objetos proporcionados por 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 creación prefabricados para programas: permiten escribir un fragmento de código una vez y volver a usarlos.

En este tema se describen los objetos en detalle.

Objetos y clases

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

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

Debe crear un objeto para poder acceder a sus miembros, excepto 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 desea 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 puede asignar una instancia de clase. La variable debe ser del tipo de la clase deseada.

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

    Dim nextCustomer As New Customer
    
  4. Ahora puede acceder 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 que desea asignar a ella. Esto se denomina enlace anticipado. Si no conoce el tipo de clase en tiempo de compilación, puede invocar el enlace tardío declarando que la variable es del Tipo de Datos Object. Sin embargo, la vinculación tardía puede hacer más lento el rendimiento y limitar el acceso a los miembros del objeto en tiempo de ejecución. Para obtener más información, vea Declaración de variable de objeto.

Varias instancias

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

Miembros de objetos

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

Acceso a miembros

Para obtener acceso a un miembro de un objeto, especifique, en orden, el nombre de la variable de objeto, un punto (.) y el nombre del miembro. En el ejemplo siguiente se establece la Text propiedad de un Label objeto .

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 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 manera que recupera y establece variables locales en un procedimiento. En el ejemplo siguiente se recupera la Width propiedad y se establece la ForeColor propiedad de un Label objeto .

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

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

Use procedimientos de propiedad cuando:

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

  • La propiedad tiene un conjunto bien definido de valores que se deben validar.

  • Si se establece el valor, se produce algún cambio perceptible en el estado del objeto, como una IsVisible propiedad.

  • Establecer 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.

Use campos cuando:

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

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

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

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

Sugerencia

Mantenga siempre los campos no constantes privados. Cuando quiera hacer que sea público, use una propiedad en su lugar.

Métodos

Un método es una acción que un objeto puede realizar. Por ejemplo, Add es un método del ComboBox objeto que agrega una nueva entrada a un 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 expuesto por un objeto .

Para obtener más información, vea procedimientos de .

Eventos

Un evento es una acción reconocida por un objeto, como hacer clic en el mouse o presionar una tecla, y para la que puede escribir código para responder. Los eventos pueden producirse como resultado de una acción de usuario o código de programa, o pueden deberse al 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 sean generados por sus objetos y gestionados por otros objetos. Para obtener más información, vea Eventos.

Miembros de instancia y miembros compartidos

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

Los miembros declarados con la Shared palabra clave son miembros compartidos, que pertenecen a la clase en su conjunto y no a ninguna instancia determinada. Un miembro compartido solo existe una vez, independientemente de cuántas instancias de su clase cree, o incluso si no crea ninguna instancia. Una variable de miembro compartido, por ejemplo, solo tiene un 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 ha creado a partir de su clase y asignado 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 Shared elemento a través de la variable del objeto.

Diferencias entre clases y módulos

La principal diferencia entre las clases y los módulos es que las clases se pueden instanciar como objetos, mientras que los módulos estándar no pueden ser instanciados. Dado que 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, a continuación, lee 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 directamente. Sin embargo, sigue siendo diferente de un módulo, ya que se puede heredar mientras que los módulos no se pueden heredar.

Nota:

Cuando el Shared modificador se aplica a un miembro de clase, está asociado a la propia clase en lugar de a una instancia determinada de la clase. Se accede directamente al miembro mediante el nombre de clase, al mismo modo 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 como ámbito una instancia específica de la clase y solo existen durante la vigencia del objeto. Para acceder a los miembros de clase desde fuera de una clase, debe usar nombres completos en el formato Object.Miembro.

Por otro lado, los miembros declarados dentro de un módulo son accesibles públicamente de forma predeterminada y se puede acceder a ellos mediante cualquier código que pueda acceder al módulo. Esto significa que las variables de un módulo estándar son variables globales de forma eficaz porque son visibles desde cualquier lugar del proyecto y existen durante la vida útil del programa.

Reutilización de clases y objetos

Los objetos permiten declarar variables y procedimientos una vez y volver a usarlos siempre que sea necesario. Por ejemplo, si desea agregar un corrector ortográfico a una aplicación, puede definir todas las variables y funciones de soporte técnico para proporcionar funcionalidad de revisión ortográfica. Si crea el corrector ortográfico como una clase, puede reutilizarlo en otras aplicaciones agregando una referencia al ensamblado compilado. Mejor aún, es posible que pueda ahorrarse algún trabajo usando una clase de corrector ortográfico que alguien más ya ha desarrollado.

.NET proporciona muchos ejemplos de componentes que están disponibles para su uso. El siguiente ejemplo utiliza 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 de tipo TimeZone y le asigna un objeto TimeZone devuelto por la propiedad CurrentTimeZone.

Relaciones entre objetos

Los objetos se pueden relacionar entre sí de varias maneras. Los tipos principales de relación son jerárquicos y 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 al describir elementos que son un subtipo de una clase más general.

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

Definir 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 siga la última línea de código en su clase. De forma predeterminada, el entorno de desarrollo integrado (IDE) genera automáticamente un End Class al escribir una Class instrucción .

  2. Siga a la instrucción Class inmediatamente con una instrucción Inherits. Especifique la clase a partir 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, podría agregar un ReverseColors método y la clase derivada podría tener el siguiente aspecto:

    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 ReversibleButton clase , puede tener acceso a todos los miembros de la Button clase , así como al ReverseColors método y a cualquier otro miembro nuevo que defina en ReversibleButton.

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

Compilación del código

Asegúrese de que el compilador puede acceder a la clase desde 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, es posible que tenga que agregar una referencia a ese proyecto. Para más información, vea Administrar referencias en un proyecto.

Relaciones de contención

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

Colecciones

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

Tutorial: Definición de clases
Proporciona una descripción paso a paso de cómo crear una clase.

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

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

Duración del objeto: cómo se crean y destruyen los objetos
Describe la creación y eliminación de 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
Describe los inicializadores de objeto, que se usan para crear instancias de tipos con nombre y anónimos mediante una sola expresión.

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