Académique Documents
Professionnel Documents
Culture Documents
Reemplazar modificadores----------------------------------------------------------38
Crear y utilizar objetos-----------------------------------------------------------------------------38
Objetos de Visual Basic y otros orígenes -----------------------------------------------------39
Cómo: Establecer y recuperar propiedades ---------------------------------------------------41
Cómo: Realizar acciones con métodos---------------------------------------------------------42
Cómo: Tratar formularios como objetos ------------------------------------------------------44
Cómo: Obtener acceso a un formulario -------------------------------------------------------45
Cómo: Utilizar la nueva palabra clave ---------------------------------------------------------46
Administración de recursos ---------------------------------------------------------------------48
Cómo: Pasar objetos a procedimientos --------------------------------------------------------49
Tutorial: Guardar un objeto en Visual Basic ---------------------------------------------------51
Cómo: Heredar de una clase en Visual Basic---------------------------------------------------56
Cómo: Leer datos de objetos de un archivo XML en Visual Basic-----------------------------57
Cómo: Escribir datos de objetos en un archivo XML de Visual Basic--------------------------58
Colecciones en Visual Basic --------------------------------------------------------------------------59
Administrar grupos de objetos-------------------------------------------------------------------61
Administrar objetos propios con colecciones----------------------------------------------------62
Clase de colección de Visual Basic---------------------------------------------------------------63
Cómo: Definir colecciones en clases propias----------------------------------------------------66
Cómo: Definir colecciones con seguridad de tipos----------------------------------------------67
Cómo: Crear una colección de objetos-----------------------------------------------------------69
Cómo: Crear una matriz de objetos--------------------------------------------------------------72
Cómo: Agregar, eliminar y recuperar los elementos de una colección-------------------------73
Cómo: Recorrer en iteración una colección de Visual Basic-------------------------------------75
Solucionar problemas de colecciones-------------------------------------------------------------76
Eventos en Visual Basic---------------------------------------------------------------------------------77
Eventos y controladores de eventos---------------------------------------------------------------78
WithEvents y la cláusula Handles------------------------------------------------------------------80
AddHandler y RemoveHandler---------------------------------------------------------------------81
Pág 1
Programación Orientada a Objetos en Visual Basic
Pág 2
Programación Orientada a Objetos en Visual Basic
Pág 3
Programación Orientada a Objetos en Visual Basic
Las palabras "clase" y "objeto" se usan con tanta frecuencia en la programación orientada a objetos que es
fácil confundir los términos. En general, una class es una representación abstracta de algo, mientras que un
objeto es un ejemplo utilizable de lo que representa la clase. La única excepción a esta regla la constituyen
los miembros de clases compartidas, que pueden utilizarse en instancias de una clase y en variables de
objeto declaradas como tipo de la clase.
Campos, propiedades, métodos y eventos
Las clases se componen de campos, propiedades, métodos y eventos. Los campos y propiedades
representan información que contiene un objeto. Los campos se parecen a las variables ya que se pueden
leer y establecer directamente. Por ejemplo, si tiene un objeto denominado "Car", podría almacenar su color
en un campo denominado "Color".
Las propiedades se recuperan y establecen como los campos, pero se implementan mediante los
procedimientos propiedad Get y Set, que proporcionan más control sobre la forma en que los valores se
establecen o se devuelven. El nivel de direccionamiento indirecto entre el valor que se va a almacenar y los
procedimientos que lo usan ayuda a aislar los datos y permite validar valores antes de asignarlos o
recuperarlos.
Los métodos representan acciones que un objeto puede realizar. Por ejemplo, un objeto "Car" podría tener
los métodos "StartEngine", "Drive" y "Stop". Los métodos se definen agregando procedimientos, ya sean
rutinas o funciones Sub, a la clase.
Los eventos son notificaciones que un objeto recibe de, o transmite a, otros objetos o aplicaciones. Los
eventos permiten a los objetos realizar acciones siempre que se produce un acontecimiento específico. Un
ejemplo de evento para la clase "Car" sería un evento "Check_Engine". Puesto que Microsoft Windows es un
sistema controlado por eventos, éstos pueden proceder de otros objetos, aplicaciones o entradas de usuario
realizadas al hacer clic con el mouse (ratón) o al presionar teclas.
Encapsulación, herencia y polimorfismo
Los campos, propiedades, métodos y eventos son solamente la mitad de la ecuación de la programación
orientada a objetos. Para que la programación orientada a objetos sea auténtica los objetos deben admitir
tres cualidades: encapsulación, herencia y polimorfismo.
La encapsulación significa que un grupo de propiedades, métodos y otros miembros relacionados se tratan
como si de una sola unidad u objeto se tratase. Los objetos pueden controlar cómo se cambian propiedades
o se ejecutan métodos. Por ejemplo, un objeto puede validar valores antes de permitir cambios en la
propiedad. La encapsulación, además, facilita la posibilidad de realizar cambios en la implementación pasado
algún tiempo, mediante una actividad denominada ocultación de datos que permite ocultar los detalles de
implementación de los objetos.
Herencia describe la posibilidad de crear nuevas clases basadas en una clase existente. La nueva clase
hereda todas las propiedades, métodos y eventos de la clase base, y puede personalizarse con propiedades y
métodos adicionales. Por ejemplo, puede crear una nueva clase denominada "Truck" basada en la clase
"Car". La clase "Truck" hereda la propiedad "Color" de la clase "Car" y puede tener propiedades adicionales
como "FourWheelDrive".
Polimorfismo significa que puede tener múltiples clases que se pueden utilizar de forma intercambiable, si
bien cada clase implementa las mismas propiedades o los mismos métodos de maneras diferentes. El
polimorfismo es importante en la programación orientada a objetos puesto que permite usar elementos que
tienen el mismo nombre, independientemente del tipo de objeto que se esté utilizando en ese momento. Por
ejemplo, dada una clase base "Car", el polimorfismo permite al programador definir diferentes métodos
"StartEngine" para cualquier número de clases derivadas. El método "StartEngine" de una clase derivada
denominada "DieselCar" puede ser totalmente diferente del método con el mismo nombre en la clase base.
Otros procedimientos o métodos pueden usar el método "StartEngine" de las clases derivadas de la misma
forma, con independencia del tipo de objeto "Car" que se esté utilizando en ese momento.
Pág 4
Programación Orientada a Objetos en Visual Basic
Pág 5
Programación Orientada a Objetos en Visual Basic
Pág 6
Programación Orientada a Objetos en Visual Basic
Herencia
Al igual que para las estructuras de Visual Basic, puede utilizar las clases para definir tipos de datos que
encapsulan un grupo de elementos relacionados. No obstante, a diferencia de las estructuras, las clases de
Visual Basic pueden heredar y extender las características de otras clases. Las clases que sirven de base
para nuevas clases se denominan clases base. Las clases que se derivan de clases base se denominan clases
derivadas. Las clases derivadas heredan todos los campos, propiedades, métodos y eventos de la clase base.
Esto significa que puede desarrollar y depurar una clase una vez y reutilizarla después como base de otras
clases.
En el siguiente ejemplo se define una clase base que representa una cuenta bancaria genérica y una clase
específica que hereda las propiedades de la clase base pero que se personaliza para describir una cuenta
corriente.
Visual Basic
Copiar código
Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
' Return the available balance.
Return AccountBalance
End Get
End Property
End Class
Class CheckingAccount
Inherits BankAccount
Sub ProcessCheck()
' Add code to process a check drawn on this account.
End Sub
End Class
Pág 7
Programación Orientada a Objetos en Visual Basic
Para obtener más información acerca de miembros compartidos, consulte Miembros compartidos en Visual
Basic.
Sombrear
Las clases derivadas pueden utilizar la palabra clave Shadows para declarar un miembro con el mismo
nombre que un miembro heredado. El tipo de datos de los miembros sombreados no es necesario que sea el
mismo que el del miembro que se sombrea. Por ejemplo, una propiedad puede sombrear una variable de
tipo Integer.
Para obtener más información acerca de miembros compartidos, consulte Sombrear en Visual Basic.
Vea también
Conceptos
Estructuras y clases
Fundamentos de la herencia
Miembros compartidos en Visual Basic
Sombrear en Visual Basic
Referencia
Shadows
Shared (Visual Basic)
Otros recursos
Crear y utilizar objetos
Herencia en Visual Basic
Nota:
Los cuadros de diálogo y los comandos de menú que se ven pueden diferir de los descritos en la
Ayuda, dependiendo de los valores de configuración o de edición activos. Para cambiar su
configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para
obtener más información, vea Valores de configuración de Visual Studio.
Visual Basic
Pág 8
Programación Orientada a Objetos en Visual Basic
Copiar código
Public Class UserNameInfo
End Class
Nota:
Puede utilizar el Editor de código de Visual Basic para agregar una clase al formulario de inicio
escribiendo la palabra clave Class seguida del nombre de la clase nueva. El Editor de código
proporciona la instrucción End Class correspondiente.
6. Defina un campo privado para la clase; para ello, agregue el siguiente código entre las instrucciones
Class y End Class:
Visual Basic
Copiar código
Private userNameValue As String
Declarar el campo como Private quiere decir que sólo se puede utilizar dentro de la clase. Se
pueden utilizar modificadores de acceso más amplio, por ejemplo Public, para hacer que los
campos estén disponibles desde fuera de la clase. Para obtener más información, vea Niveles de
acceso en Visual Basic.
7. Defina una propiedad para la clase agregando el código siguiente:
Visual Basic
Copiar código
Public Property UserName() As String
Get
' Gets the property value.
Return userNameValue
End Get
Set(ByVal Value As String)
' Sets the property value.
userNameValue = Value
End Set
End Property
Visual Basic
Copiar código
Public Sub Capitalize()
Pág 9
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Public Sub New(ByVal UserName As String)
' Set the property value.
Me.UserName = UserName
End Sub
Cuando se crea un objeto basado en esta clase, se llama al constructor Sub New automáticamente.
Este constructor establece el valor del campo que contiene el nombre de usuario.
Visual Basic
Copiar código
' Create an instance of the class.
Dim user As New UserNameInfo("Moore, Bobby")
' Capitalize the value of the property.
user.Capitalize()
' Display the value of the property.
MsgBox("The original UserName is: " & user.UserName)
' Change the value of the property.
user.UserName = "Worden, Joe"
' Redisplay the value of the property.
MsgBox("The new UserName is: " & user.UserName)
Pág 10
Programación Orientada a Objetos en Visual Basic
Clases y módulos
Actualización: noviembre 2007
Tanto las clases como los módulos son tipos de referencia que encapsulan los elementos definidos en ellos,
pero difieren en la forma en que se realiza el acceso a los elementos desde otros procedimientos.
Diferencias entre clases y módulos
La diferencia principal entre clases y módulos consiste en que pueden crearse instancias de clases como
objetos pero no de módulos. Como sólo existe 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
obtendrá el mismo valor si lee luego esa variable. En comparación, los datos de objeto existen
individualmente para cada objeto con instancias. Otra distinción es que, a diferencia de los módulos
estándar, las clases pueden implementar interfaces.
Nota:
Cuando el modificador Shared se aplica a un miembro de clase, está asociado con la propia clase
en lugar de con una instancia determinada de la clase. Se tiene acceso directo al miembro
mediante el nombre de clase, de la misma manera que se tiene acceso a los miembros de
módulos. Para obtener más información acerca de miembros compartidos, consulte Miembros
compartidos en Visual Basic.
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 sólo existen mientras dure el
objeto. Para tener acceso a los miembros de clases desde el exterior de una clase, debe utilizar los nombres
completos con el formato Objeto.Miembro.
Por otro lado, los miembros declarados dentro de un módulo son de manera predeterminada accesibles
públicamente y se puede obtener acceso a ellos mediante cualquier código que tenga acceso al módulo. Esto
significa que las variables en un módulo estándar son de hecho variables globales porque son visibles desde
cualquier parte del proyecto y existen durante toda la vida útil del programa.
Vea también
Pág 11
Programación Orientada a Objetos en Visual Basic
Conceptos
Estructuras y clases
Miembros compartidos en Visual Basic
Referencia
Shared (Visual Basic)
Otros recursos
Descripción de las clases
Nota:
El destructor Finalize es un método protegido al que sólo se puede llamar desde la clase a la que pertenece
o desde clases derivadas. El sistema llama automáticamente a Finalize cuando se destruye un objeto, por lo
que no se debe llamar explícitamente a Finalize desde fuera de una implementación de su clase derivada.
A diferencia de Class_Terminate, que se ejecuta en cuanto un objeto se establece en Nothing,
normalmente hay un retardo entre el momento en que un objeto pierde el ámbito y el momento en que
Visual Basic llama al destructor Finalize. Visual Basic 2005 y versiones posteriores proporcionan un segundo
Pág 12
Programación Orientada a Objetos en Visual Basic
tipo de destructor, Dispose, al que se puede llamar explícitamente en cualquier momento para liberar
recursos de forma inmediata.
Nota:
Interfaz IDisposable
A menudo, las instancias de clase controlan los recursos que no administra CLR, como identificadores de
Windows y conexiones de bases de datos. Estos recursos se deben desechar en el método Finalize de la
clase, a fin de liberarlos cuando el recolector de elementos no utilizados destruya el objeto. Sin embargo, el
recolector de elementos no utilizados sólo destruye los objetos cuando CLR requiere más memoria libre. Esto
significa que los recursos pueden no liberarse hasta mucho después de que el objeto salga del ámbito.
Para complementar la recolección de elementos no utilizados, las clases pueden proporcionar un mecanismo
que administra activamente los recursos del sistema si implementan la interfaz IDisposable. IDisposable
tiene un método, Dispose, al que los clientes deben llamar cuando terminan de utilizar un objeto. Se puede
utilizar el método Dispose para liberar recursos inmediatamente y realizar tareas como cerrar archivos y
conexiones de bases de datos. A diferencia del destructor Finalize, el método Dispose no se llama
automáticamente. Los clientes de una clase deben llamar explícitamente a Dispose cuando se desea liberar
recursos inmediatamente.
Implementar IDisposable
Una clase que implementa la interfaz IDisposable debería incluir estas secciones de código:
Un campo para mantener el seguimiento de si se ha desechado el objeto:
Copiar código
Protected disposed As Boolean = False
Una sobrecarga de Dispose que libera los recursos de la clase. Los métodos Dispose y Finalize de
la clase base deben llamar a este método:
Copiar código
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
' Insert code to free managed resources.
End If
' Insert code to free unmanaged resources.
End If
Me.disposed = True
End Sub
Una implementación de Dispose que contiene sólo el código siguiente:
Copiar código
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
Pág 13
Programación Orientada a Objetos en Visual Basic
End Sub
Un reemplazo del método Finalize que contiene sólo el código siguiente:
Copiar código
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
Derivar de una clase que implementa IDisposable
Una clase derivada de una clase base que implementa la interfaz IDisposable no necesita reemplazar
ninguno de los métodos base a menos que utilice recursos adicionales que se deban desechar. En esa
situación, la clase derivada debería reemplazar el método Dispose(disposing) de la clase base para
desechar los recursos de la clase derivada. Este reemplazo debe llamar al método Dispose(disposing) de
la clase base.
Copiar código
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
' Insert code to free managed resources.
End If
' Insert code to free unmanaged resources.
End If
MyBase.Dispose(disposing)
End Sub
Una clase derivada no debería reemplazar los métodos Dispose y Finalize de la clase base. Cuando se llama
a estos métodos desde una instancia de una clase derivada, la implementación de estos métodos en la clase
base llama al reemplazo del método Dispose(disposing) en la clase derivada.
Visualización
El diagrama siguiente muestra qué métodos se heredan y qué métodos se reemplazan en la clase derivada.
Cuando se sigue el modelo DisposeFinalize, los recursos de la clase derivada y de la clase base se
desechan correctamente. El diagrama siguiente muestra a qué métodos se llaman cuando las clases se
desechan y finalizan.
Pág 14
Programación Orientada a Objetos en Visual Basic
Pág 15
Programación Orientada a Objetos en Visual Basic
Pág 16
Programación Orientada a Objetos en Visual Basic
Este ejemplo de código también está disponible como fragmento de código de IntelliSense. En el selector de
fragmentos de código, se encuentra en Lenguaje Visual Basic. Para obtener más información, vea Cómo:
Insertar fragmentos de código en el código (Visual Basic).
Compilar el código
Para este ejemplo se necesita:
Obtener acceso a los miembros de los espacios de nombres System y System.ComponentModel.
Agregar una instrucción Imports si no se incluyen nombres de miembro completos en el código.
Para obtener más información, vea Instrucción Imports (Tipo y espacio de nombres de .NET).
Estos cambios se deben realizar en el código:
Reemplace ResourceClass con el nombre de la clase que implementa IDisposable.
Utilice la comprobación de AnyOtherMethods en cualquier método que utilice recursos que se
pueden haber desechado.
Reemplace la declaración managedResource con declaraciones de cualquier objeto administrado en
su clase que deba ser desechado. Si una clase implementa IDisposable o tiene un método Close,
probablemente necesita ser desechado. En el método Dispose, cierre o deseche estos objetos.
Pág 17
Programación Orientada a Objetos en Visual Basic
Cuando se define una clase derivada de otra, la primera línea del constructor debe ser una llamada al
constructor de la clase base, a no ser que ésta tenga un constructor accesible que no requiera parámetros.
Por ejemplo, para llamar a la clase base que contiene el constructor anterior, sería MyBase.New(s). En caso
contrario, MyBase.New es opcional y el tiempo de ejecución de Visual Basic la llama implícitamente.
Después de escribir el código para llamar al constructor del objeto primario, puede agregar cualquier código
de inicialización adicional en el procedimiento Sub New. Sub New puede aceptar argumentos cuando se
realiza la llamada como a un constructor con parámetros. Estos parámetros se pasan desde el procedimiento
que llama al constructor; por ejemplo, Dim AnObject As New ThisClass(X).
Destructores
El código siguiente muestra cómo utilizar Dispose y Finalize para liberar los recursos de una clase base.
Nota:
Pág 18
Programación Orientada a Objetos en Visual Basic
Debería seguir las instrucciones para implementar IDisposable incluidas en Duración de los
objetos: cómo se crean y destruyen.
Visual Basic
Copiar código
' Design pattern for a base class.
Public Class Base
Implements IDisposable
El código siguiente muestra cómo utilizar Dispose y Finalize para liberar los recursos de una clase
derivada.
Visual Basic
Copiar código
' Design pattern for a derived class.
Pág 19
Programación Orientada a Objetos en Visual Basic
El código siguiente muestra un modelo de diseño común para el destructor Dispose, utilizando un bloque
Using y un bloque Try...Finally equivalente.
Visual Basic
Copiar código
Sub DemonstrateUsing()
Using d As New Derived
' Code to use the Derived object goes here.
End Using
End Sub
Sub DemonstrateTry()
Dim d As Derived = Nothing
Try
d = New Derived
' Code to use the Derived object goes here.
Finally
' Call the Dispose method when done, even if there is an
exception.
If Not d Is Nothing Then
d.Dispose()
End If
End Try
Pág 20
Programación Orientada a Objetos en Visual Basic
End Sub
En el siguiente ejemplo se crea un objeto mediante un constructor con parámetros y se llama a los
destructores cuando el objeto deja de ser necesario.
Nota:
Aunque este ejemplo usa Collect para mostrar a qué métodos llama el recolector de elementos no
utilizados para eliminar métodos, en general es más conveniente dejar que Common Language
Runtime (CLR) administre la recolección de elementos no utilizados.
Visual Basic
Copiar código
Sub TestConstructorsAndDestructors()
' Demonstrate how the Using statement calls the Dispose method.
Using AnObject As New ThisClass(6)
' Place statements here that use the object.
MsgBox("The value of ThisProperty after being initialized " & _
" by the constructor is " & AnObject.ThisProperty & ".")
End Using
' Demonstrate how the garbage collector calls the Finalize method.
Dim AnObject2 As New ThisClass(6)
AnObject2 = Nothing
GC.Collect()
End Sub
Pág 21
Programación Orientada a Objetos en Visual Basic
Pág 22
Programación Orientada a Objetos en Visual Basic
End Class
Cuando ejecute este ejemplo, la clase ThisClass llama al constructor Sub New de la clase BaseClass.
Una vez que finaliza el constructor de la clase base, la clase ThisClass ejecuta el resto de instrucciones de
Sub New que inicializan un valor para la propiedad ThisProperty.
Cuando la clase ya no es necesaria, se llama al destructor Dispose en ThisClass.
Este ejemplo muestra lo siguiente:
BaseClass is initializing with Sub New.
ThisClass is initializing with Sub New.
The value of ThisProperty after being initialized by the constructor is 6.
ThisClass is shutting down with Sub Dispose.
ThisClass is shutting down with the Sub Dispose overload.
BaseClass is shutting down with Sub Finalize.
BaseClass is initializing with Sub New.
ThisClass is initializing with Sub New.
ThisClass is shutting down with Sub Finalize.
ThisClass is shutting down with the Sub Dispose overload.
BaseClass is shutting down with Sub Finalize.
Vea también
Conceptos
Duración de los objetos: cómo se crean y destruyen
Métodos de finalización y destructores
Cómo funcionan los métodos New y Finalize en una jerarquía de clases
Referencia
Dispose
Pág 23
Programación Orientada a Objetos en Visual Basic
Pág 24
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Class ThisClass
Public ThisField As String
End Class
Nota:
Si está trabajando dentro del entorno de desarrollo integrado (IDE) de Visual Studio, puede
dirigirlo para crear procedimientos de propiedad Get y Set vacíos. Escriba
Property NombreProp As TipoDeDatos (donde NombreProp es el nombre de la propiedad y
TipoDeDatos es un tipo de datos específico, por ejemplo Integer), y los procedimientos de
propiedad aparecen en el Editor de código.
Pág 25
Programación Orientada a Objetos en Visual Basic
Pág 26
Programación Orientada a Objetos en Visual Basic
' Assume, for this example, that the only valid values for
' the field and property are numbers less than 10.
Dim NewClass As New ThisClass
' The attempt to set the field to a value greater than 10 will
silently fail.
NewClass.ThisProperty = 36
' The next statement will print the old value of 0 instead.
MsgBox("ThisProperty = " & NewClass.ThisProperty)
End Sub
Pág 27
Programación Orientada a Objetos en Visual Basic
La mayoría de las propiedades tienen procedimientos de propiedad Get y Set que puede utilizar para leer y
modificar el valor que almacenan. No obstante, puede utilizar los modificadores ReadOnly y WriteOnly
para restringir la modificación o la lectura de las propiedades.
Las propiedades de sólo lectura no pueden tener procedimientos de propiedad Set; estas propiedades son
útiles para elementos que desea exponer, pero cuya modificación no desea permitir. Por ejemplo, podría
utilizar una propiedad de sólo lectura para proporcionar la velocidad del procesador de un equipo.
Las propiedades de sólo escritura no pueden tener procedimientos de propiedad Get y son útiles para
configurar objetos con datos que no deben o no se pueden almacenar en el objeto. Por ejemplo, se puede
utilizar una propiedad de sólo escritura para tomar una contraseña y cambiar el estado del objeto sin
almacenar la contraseña.
Nota:
Las versiones anteriores de Visual Basic admiten procedimientos de propiedad Let que se utilizan
al asignar objetos a las propiedades. Visual Basic elimina la necesidad de procedimientos de
propiedad Let porque la asignación de objetos se controla como cualquier otro tipo de asignación.
Vea también
Conceptos
Procedimientos de propiedad
Comparación de procedimientos de propiedades y campos
Referencia
Get (Instrucción)
Instrucción Set (Visual Basic)
ReadOnly (Visual Basic)
WriteOnly
Pág 28
Programación Orientada a Objetos en Visual Basic
Conceptos
Clases y módulos
Propiedades y procedimientos de propiedad
Tipos de datos en Visual Basic
Métodos compartidos
Los métodos compartidos pueden llamarse directamente desde la clase sin necesidad de crear previamente
una instancia de la clase. Los métodos compartidos son útiles cuando se desea asociar un método con una
instancia específica de una clase. Los métodos compartidos no se pueden declarar mediante los
modificadores Overridable, NotOverridable o MustOverride. Los métodos que se declaran en módulos
están compartidos implícitamente y no pueden utilizar el modificador Shared explícitamente.
Ejemplo
Visual Basic
Copiar código
Class ShareClass
Shared Sub SharedSub()
MsgBox("Shared method.")
End Sub
End Class
Sub Test()
' Call the method.
ShareClass.SharedSub()
End Sub
Pág 29
Programación Orientada a Objetos en Visual Basic
utilizan sus objetos, ya que le permite realizar futuros cambios sin que afecte al código que utiliza los
objetos.
La protección de los detalles de la implementación de un objeto es otra faceta de la encapsulación. La
encapsulación permite mejorar el rendimiento de los métodos o cambiar totalmente la forma de implementar
un método, sin necesidad de modificar el código que utiliza el método.
Vea también
Tareas
Cómo: Agregar eventos a una clase
Conceptos
Propiedades frente a métodos
Miembros compartidos en Visual Basic
Referencia
Overridable
NotOverridable
MustOverride
Shared (Visual Basic)
Public (Visual Basic)
Private (Visual Basic)
Protected (Visual Basic)
Friend (Visual Basic)
Pág 30
Programación Orientada a Objetos en Visual Basic
Vea también
Tareas
Cómo: Agregar campos y propiedades a una clase
Conceptos
Métodos de una clase
Referencia
Item (Propiedad, objeto Collection)
Propiedades predeterminadas
Actualización: noviembre 2007
Una propiedad que acepta argumentos puede declararse como propiedad predeterminada de una clase. Una
propiedad predeterminada es aquella que utiliza Visual Basic cuando no se haya asignado una propiedad
específica para un objeto. Las propiedades predeterminadas son útiles porque permiten que el código fuente
sea más compacto al omitirse nombres de propiedades que se utilizan frecuentemente.
Las mejores candidatas a propiedades predeterminadas son las propiedades que aceptan parámetros y que
se utilizarán con más frecuencia. Por ejemplo, la propiedad Item es una buena opción como propiedad
predeterminada de una clase de colección, ya que se usa con frecuencia.
Las siguientes reglas se aplican a las propiedades predeterminadas:
Un tipo sólo puede tener una propiedad predeterminada, incluyendo las propiedades heredadas de
una clase base. Hay una excepción para esta regla. Una propiedad predeterminada definida en una
clase base puede ser sombreada por otra propiedad predeterminada de una clase derivada.
Si una propiedad predeterminada de una clase base es sombreada por una propiedad no
predeterminada de una clase derivada, la propiedad predeterminada continúa permitiendo el acceso
mediante la sintaxis de propiedad predeterminada.
Una propiedad predeterminada no puede ser de tipo Shared o Private.
Si una propiedad sobrecargada es una propiedad predeterminada, también lo serán todas las demás
propiedades sobrecargadas que tengan el mismo nombre.
Las propiedades predeterminadas deben aceptar al menos un argumento.
Ejemplo
El siguiente ejemplo declara una propiedad que contiene una matriz de cadenas como propiedad
predeterminada de una clase:
Visual Basic
Copiar código
Class Class2
' Define a local variable to store the property value.
Private PropertyValues As String()
' Define the default property.
Default Public Property Prop1(ByVal Index As Integer) As String
Get
Return PropertyValues(Index)
End Get
Set(ByVal Value As String)
If PropertyValues Is Nothing Then
' The array contains Nothing when first accessed.
Pág 31
Programación Orientada a Objetos en Visual Basic
ReDim PropertyValues(0)
Else
' Re-dimension the array to hold the new element.
ReDim Preserve PropertyValues(UBound(PropertyValues) + 1)
End If
PropertyValues(Index) = Value
End Set
End Property
End Class
' The following two lines of code use default property syntax.
Vea también
Conceptos
Recomendación de actualización: resolver las propiedades predeterminadas sin parámetros
Cambios en las propiedades predeterminadas para usuarios de Visual Basic 6.0
Referencia
Default (Visual Basic)
Pág 32
Programación Orientada a Objetos en Visual Basic
Uso de la sobrecarga
La sobrecarga es especialmente útil cuando un modelo de objeto exige el uso de nombres idénticos para
procedimientos que operan en diferentes tipos de datos. Por ejemplo, una clase que puede mostrar
diferentes tipos de datos podría tener procedimientos Display como los siguientes:
Visual Basic
Copiar código
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
Sin sobrecarga, sería necesario crear distintos nombres para cada procedimiento, aunque realicen el mismo
cometido, como se muestra a continuación:
Visual Basic
Copiar código
Sub DisplayChar(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Sub DisplayInt(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Sub DisplayDouble(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
La sobrecarga facilita el uso de propiedades o métodos, puesto que ofrece una selección de tipos de datos
que se pueden utilizar. Por ejemplo, se pude llamar al método sobrecargado Display descrito anteriormente
con cualquiera de las siguientes líneas de código:
Visual Basic
Copiar código
' Call Display with a literal of type Char.
Display("9"c)
' Call Display with a literal of type Integer.
Display(9)
' Call Display with a literal of type Double.
Display(9.9R)
Pág 33
Programación Orientada a Objetos en Visual Basic
En tiempo de ejecución, Visual Basic llama al procedimiento correcto basándose en los tipos de datos de los
parámetros que se han especificado.
Nota:
Reglas de sobrecarga
Es posible crear un miembro sobrecargado para una clase agregando dos o más propiedades o métodos con
el mismo nombre. A excepción de los miembros derivados sobrecargados, cada miembro sobrecargado debe
tener distintas listas de parámetros, y los elementos que a continuación se enumeran, no se pueden utilizar
como características diferenciadoras al sobrecargar una propiedad o un procedimiento:
Modificadores, como por ejemplo ByVal o ByRef, que se aplican a un miembro o parámetros de un
miembro.
Nombres de parámetros
Tipos de valores devueltos de procedimientos
La palabra clave Overloads es opcional en la sobrecarga, aunque si algún miembro sobrecargado la utiliza,
todos los demás miembros sobrecargados con el mismo nombre deben especificarla también.
Las clases derivadas pueden sobrecargar miembros heredados con miembros que tengan idénticos
parámetros y tipos de parámetros, un proceso denominado sombrear por nombre y firma. Si se utiliza la
palabra clave Overloads al sombrear por nombre y firma, se utilizará la implementación de la clase
derivada del miembro en vez de la implementación de la clase base y todas las demás sobrecargas de dicho
miembro estarán disponibles para las instancias de la clase derivada.
Si se omite la palabra clave Overloads al sobrecargar un miembro heredado con un miembro que tiene
parámetros y tipos de parámetros idénticos, la sobrecarga se denomina sombrear por nombre. El proceso
sombrear por nombre reemplaza a la implementación heredada de un miembro y hace que todas las demás
sobrecargas no estén disponibles para las instancias de la clase derivada y sus descendientes.
Los modificadores Overloads y Shadows no pueden utilizarse a la vez con la misma propiedad o método.
Ejemplo
El ejemplo siguiente crea métodos sobrecargados que aceptan una representación String o Decimal de una
cantidad en dólares y devuelven una cadena que contiene los impuestos sobre ventas.
Visual Basic
Copiar código
Public Class TaxClass
Overloads Function TaxAmount(ByVal decPrice As Decimal, _
ByVal TaxRate As Single) As String
TaxAmount = "Price is a Decimal. Tax is $" & _
(CStr(decPrice * TaxRate))
End Function
Pág 34
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Sub ShowTax()
' 8% tax rate.
Const TaxRate As Single = 0.08
' $64.00 Purchase as a String.
Dim strPrice As String = "64.00"
' $64.00 Purchase as a Decimal.
Dim decPrice As Decimal = 64
Dim aclass As New TaxClass
'Call the same method with two different kinds of data.
MsgBox(aclass.TaxAmount(strPrice, TaxRate))
MsgBox(aclass.TaxAmount(decPrice, TaxRate))
End Sub
Pág 35
Programación Orientada a Objetos en Visual Basic
Overloads
Shadows
Nota:
Ejemplo
Suponga que desea definir clases para controlar la nómina. Podría definir una clase genérica Payroll que
contenga un método RunPayroll para calcular la nómina de una semana típica. Podría utilizar Payroll
como clase base de una clase más especializada BonusPayroll que se utilizaría para distribuir
bonificaciones entre los empleados.
La clase BonusPayroll puede heredar y reemplazar al método PayEmployee definido en la clase base
Payroll.
En el siguiente ejemplo se define una clase base, Payroll, y una clase derivada, BonusPayroll, que
reemplaza a un método heredado, PayEmployee. Un procedimiento, RunPayroll crea y luego pasa un
objeto Payroll y un objeto BonusPayroll a una función, Pay, que ejecuta el método PayEmployee de
ambos objetos.
Visual Basic
Copiar código
Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D
Class Payroll
Overridable Function PayEmployee( _
ByVal HoursWorked As Decimal, _
ByVal PayRate As Decimal) _
Pág 36
Programación Orientada a Objetos en Visual Basic
As Decimal
Class BonusPayroll
Inherits Payroll
Overrides Function PayEmployee( _
ByVal HoursWorked As Decimal, _
ByVal PayRate As Decimal) _
As Decimal
' The following code calls the original method in the base
' class, and then modifies the returned value.
PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) *
BonusRate
End Function
End Class
Sub RunPayroll()
Dim PayrollItem As Payroll = New Payroll
Dim BonusPayrollItem As New BonusPayroll
Dim HoursWorked As Decimal = 40
Vea también
Conceptos
Propiedades y métodos sobrecargados
Reemplazar modificadores
Sombrear en Visual Basic
Otros recursos
Polimorfismo
Pág 37
Programación Orientada a Objetos en Visual Basic
Reemplazar modificadores
Actualización: noviembre 2007
Puede utilizar los modificadores NotOverridable y MustOverride en una clase base para controlar cómo
las clases derivadas reemplazan sus propiedades y métodos.
El modificador NotOverridable define un método de una clase base que no se puede reemplazar en clases
derivadas. Todos los métodos son NotOverridable a menos que se marquen con el modificador
Overridable. Puede utilizar el modificador NotOverridable si no desea permitir que un método
reemplazado sea reemplazado de nuevo en una clase derivada.
Los métodos definidos con el modificador MustOverride no tienen ninguna implementación en la clase base
y deben implementarse en clases derivadas. Las clases que contienen métodos MustOverride deben
marcarse con el modificador MustInherit.
Ejemplo
Visual Basic
Copiar código
MustInherit Class BaseClass
Public MustOverride Sub aProcedure()
End Class
Class DerivedClass
Inherits BaseClass
Public NotOverridable Overrides Sub aProcedure()
' Override a procedure inherited from the base class
' and mark it with the NotOverridable modifier so that
' it cannot be overridden in classes derived from this class.
End Sub
End Class
Vea también
Conceptos
Propiedades y métodos sobrecargados
Contraer todo
Esta página es específica de
Microsoft Visual Studio 2008/.NET Framework 3.5
Hay además otras versiones disponibles para:
Pág 38
Programación Orientada a Objetos en Visual Basic
controles que se utilizan hasta los formularios en los que se colocan. En esta sección se explica dónde se
originan los objetos y la forma de utilizarlos.
En esta sección
Objetos de Visual Basic y otros orígenes
Explica cómo se utilizan los objetos de Microsoft Word, Microsoft Excel y otras aplicaciones.
Cómo: Establecer y recuperar propiedades
Explica cómo cambiar y obtener valores de propiedad.
Cómo: Realizar acciones con métodos
Explica qué son los métodos y cómo se utilizan.
Cómo: Tratar formularios como objetos
Muestra el uso de formularios como objetos ordinarios.
Cómo: Obtener acceso a un formulario
Muestra cómo tener acceso a los miembros de un formulario sin tener que crear una variable.
Cómo: Utilizar la nueva palabra clave
Muestra cómo crear instancias de formularios, clases definidas en módulos de clase y colecciones.
Administración de recursos
Explica cómo se pueden ahorrar memoria y recursos del sistema mediante la liberación de
referencias a objetos.
Cómo: Pasar objetos a procedimientos
Explica cómo pasar objetos como argumentos a los procedimientos.
Tutorial: Guardar un objeto en Visual Basic
Muestra cómo se puede utilizar la serialización para guardar los datos de un objeto entre instancias,
permitiendo así almacenar valores y recuperarlos la próxima vez que se cree una instancia del
objeto.
Cómo: Heredar de una clase en Visual Basic
Muestra cómo se define una clase base y se declaran clases que amplían la clase base.
Secciones relacionadas
Objetos en Visual Basic
Trata los fundamentos de la programación orientada a objetos.
Administrar grupos de objetos
Proporciona un listado de técnicas para trabajar con matrices y colecciones de objetos.
Cómo: Realizar varias acciones en un objeto
Trata el uso de la instrucción With...End With para simplificar el acceso a las propiedades.
Contraer todo
Pág 39
Programación Orientada a Objetos en Visual Basic
Los objetos que se utilizan en Visual Basic proceden de orígenes internos y externos. Entre los ejemplos de
objetos internos se incluyen los objetos y clases intrínsecos en el proyecto; entre los ejemplos de objeto
externos se incluyen los ensamblados y los objetos COM.
Objetos internos
Los objetos intrínsecos (o integrados) son los que proporciona Visual Basic de forma nativa. Entre éstos se
incluyen los tipos escalares primitivos como Integer y Double, así como los tipos Array y String. No hace
falta crear referencias a objetos internos antes de utilizarlos en el proyecto.
Otros objetos internos son instancias de clases en el proyecto actual. Estas clases pueden utilizarse siempre
que sean necesarias dentro del proyecto y pueden estar disponibles para otras aplicaciones cuando se crea
un ensamblado.
Objetos externos
Los objetos externos son los que proceden de otros proyectos o ensamblados que no están disponibles en el
proyecto de manera predeterminada. Es necesario crear referencias de proyecto a los objetos externos para
poder utilizarlos en el proyecto.
Los ensamblados son el origen más común de objetos para las aplicaciones de Visual Basic. .NET Framework
incluye ensamblados que contienen objetos que se utilizan habitualmente. Algunos objetos en .NET
Framework se tratan como objetos intrínsecos, pero la mayoría de los ensamblados deben importarse de
forma explícita mediante la instrucción Imports antes de poder utilizarlos. Cualquier lenguaje compatible
con Common Language Specification (CLS), como Visual Basic o Visual C#, puede crear y utilizar
ensamblados. Para obtener más información, consulte Ensamblados.
En el pasado, los componentes COM eran el origen tradicional de objetos para programadores de Visual
Basic, pero actualmente los ensamblados de .NET Framework constituyen una opción mejor para los nuevos
objetos. Todavía se pueden utilizar los componentes COM existentes en las aplicaciones; no obstante, el
acceso a los objetos COM debe realizarse mediante clases de interoperabilidad de .NET Framework. El acceso
a una biblioteca COM requiere el uso de un ensamblado de interoperabilidad que contenga clases de
interoperabilidad para cada clase COM definida en la biblioteca. Para obtener más información, consulte
Interoperabilidad COM.
Además de tener acceso a las clases de .NET Framework nativas y las clases COM, también es posible llamar
a las funciones definidas en bibliotecas de vínculos dinámicos (archivos DLL), como las de la API Win32.
Visual Basic le permite llamar a las funciones en archivos DLL una vez que se hayan declarado con una
instrucción Declare. Visual Basic agrega la funcionalidad a la instrucción Declare y le permite utilizar el
atributo DllImportAttribute para especificar valores predeterminados para elementos como
CallingConvention, ExactSpelling y SetLastError. Los parámetros de instrucciones Declare pueden anotarse
con el atributo MarshalAsAttribute, que admite la conversión de parámetros en formas que no eran posibles
en versiones anteriores de Visual Basic.
Vea también
Tareas
Tutorial: Implementar la herencia mediante objetos COM
Cómo: Establecer y recuperar propiedades
Conceptos
Relaciones entre objetos
Referencia
Pág 40
Programación Orientada a Objetos en Visual Basic
Declare (Instrucción)
Instrucción Imports (Tipo y espacio de nombres de .NET)
DllImportAttribute
Integer (Tipo de datos, Visual Basic)
Double (Tipo de datos, Visual Basic)
String (Tipo de datos, Visual Basic)
MarshalAsAttribute
Otros recursos
Crear y utilizar objetos
Visual Basic
Copiar código
' Set the Top property to 200 twips.
TextBox1.Top = 200
' Display the text box.
TextBox1.Visible = True
' Display 'hello' in the text box.
TextBox1.Text = "hello"
Pág 41
Programación Orientada a Objetos en Visual Basic
Nota:
También puede establecer una propiedad pasándola a parámetros ByRef, en cuyo caso la
propiedad queda modificada por el resultado devuelto por el parámetro ByRef.
Visual Basic
Copiar código
RadioButton1.Top += 20
Vea también
Tareas
Cómo: Realizar acciones con métodos
Conceptos
Objetos de Visual Basic y otros orígenes
Otros recursos
Crear y utilizar objetos
Pág 42
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
' Force the control to repaint.
PictureBox1.Refresh()
Nota:
Visual Basic
Copiar código
MsgBox("Database update complete", _
MsgBoxStyle.OKOnly Or MsgBoxStyle.Exclamation, _
"My Application")
Visual Basic
Copiar código
Dim Response As MsgBoxResult
Response = MsgBox("Do you want to exit?", _
MsgBoxStyle.YesNo Or MsgBoxStyle.Question, _
"My Application")
Este ejemplo utiliza el valor devuelto desde el método Len como un argumento para MsgBox.
Visual Basic
Copiar código
Dim TestStr As String = "Some String"
' Display the string "String length is : 11".
MsgBox("String length is : " & Len(TestStr))
Pág 43
Programación Orientada a Objetos en Visual Basic
Vea también
Tareas
Cómo: Establecer y recuperar propiedades
Conceptos
Relaciones entre objetos
Otros recursos
Crear y utilizar objetos
Visual Basic
Copiar código
' Create a custom method on a form.
Public Sub PrintMyJob()
' Insert the code for your method here.
End Sub
Visual Basic
Copiar código
Public IDNumber As Integer
Nota:
Visual Basic proporciona el mismo nombre a una variable global implícita que el formulario para
Pág 44
Programación Orientada a Objetos en Visual Basic
cada clase de formulario. Para obtener más información, consulte Cómo: Obtener acceso a un
formulario.
2. Asigne el formulario a una variable de objeto. La variable de objeto hace referencia a una instancia
nueva de la clase de formulario.
El ejemplo siguiente llama correctamente al procedimiento PrintMyJob:
Visual Basic
Copiar código
Dim newForm1 As New Form1
newForm1.PrintMyJob()
Visual Basic
Copiar código
newForm1.Show()
Vea también
Tareas
Cómo: Utilizar la nueva palabra clave
Conceptos
Procedimientos de propiedad
Visual Basic
Copiar código
Public Sub ChangeForm1Colors()
Form1.ForeColor = System.Drawing.Color.Coral
Pág 45
Programación Orientada a Objetos en Visual Basic
Form1.BackColor = System.Drawing.Color.Cyan
Form1.Show()
End Sub
Si Form1 no existe, Visual Basic lo creará. No tiene que declarar una variable para él.
Crear una instancia adicional de un formulario
Si desea crear un nuevo formulario, en lugar de tener acceso a uno existente, puede declarar una variable e
inicializarla utilizando la palabra clave New.
Visual Basic
Copiar código
Public Sub GetSecondInstance()
Dim newForm1 As New Form1
newForm1.BackColor = System.Drawing.Color.YellowGreen
newForm1.Show()
End Sub
Si desea mostrar dos o más copias del mismo formulario, debe crear copias adicionales. El ejemplo
anterior crea una segunda copia de Form1 y lo pinta de un color diferente. Puede tener acceso a la
copia original utilizando Form1 y a la segunda copia mediante newForm1.
Vea también
Referencia
System.Drawing
Form
New (Visual Basic)
La primera instrucción declara una variable de objeto que puede contener una referencia a un objeto de
botón. Sin embargo, la variable Button1 contiene el valor Nothing hasta que le asigne un objeto de tipo
Pág 46
Programación Orientada a Objetos en Visual Basic
Button. La segunda instrucción también define una variable que puede contener un objeto de botón, pero la
palabra clave New crea un objeto de botón y lo asigna a la variable Button2.
Como los formularios y controles son en realidad clases, puede utilizar la palabra clave New para crear
instancias nuevas de estos elementos, cuando sea necesario.
Visual Basic
Copiar código
Dim f As New Form1
f.Show()
Visual Basic
Copiar código
Public Class ShowMe
Sub ShowFrm()
Dim frmNew As Form1
frmNew = New Form1
frmNew.Show()
frmNew.WindowState = FormWindowState.Minimized
End Sub
End Class
Visual Basic
Pág 47
Programación Orientada a Objetos en Visual Basic
Copiar código
Protected Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim clsNew As New ShowMe
clsNew.ShowFrm()
End Sub
6. Para utilizar este ejemplo, ejecute la aplicación y haga clic en el botón de comando varias veces.
Aparecerá un icono minimizado de formulario en la barra de tareas cada vez que se cree una
instancia nueva de la clase ShowMe.
Vea también
Otros recursos
Crear y utilizar objetos
Administración de recursos
Actualización: noviembre 2007
Todos los objetos consumen recursos del sistema, como memoria, identificadores de archivo y conexiones de
bases de datos. Common Language Runtime (CLR) administra los recursos automáticamente y generalmente
no hay que preocuparse de liberar los objetos innecesarios. No obstante, comprender cómo funciona la
administración de recursos puede ayudarle a diseñar las aplicaciones más eficazmente.
Recolección de elementos no utilizados
CLR utiliza un sistema denominado recolección de elementos no utilizados para administrar los recursos
asignados. La recolección de elementos no utilizados del sistema libera los recursos de un objeto cuando la
ejecución de código de la aplicación ya no puede tener acceso al objeto. El algoritmo de la recolección de
elementos no utilizados es no determinista, por lo que no se puede determinar cuándo los CLR liberarán los
recursos de un objeto. En las siguientes secciones se describen algunos de los cambios en la forma de
administrar los recursos en Visual Basic.
Asignar objetos a Nothing
Nothing es una palabra clave utilizada por Visual Basic para indicar que una variable de objeto no contiene
una referencia a un objeto. En las versiones anteriores de Visual Basic se recomendaba asignar los objetos
no utilizados a Nothing para disociar la variable de objeto y liberar recursos. Aún pueden asignarse objetos
no utilizados a Nothing, pero debido a la forma en que Visual Basic administra los recursos, este proceso no
garantiza que los objetos queden liberados inmediatamente. En general, sólo se deben asignar a Nothing
objetos duraderos (como miembros compartidos o variables globales).
Desechar
Algunos objetos admiten un método denominado Dispose cuya finalidad consiste en liberar recursos del
sistema de forma más expeditiva. Las clases que admiten el método Dispose deben implementar la interfaz
IDisposable. Es necesario llamar explícitamente al método Dispose cuando se deseen liberar recursos de
objetos. Por ejemplo:
ThisObject.Dispose()
Finalize
Otro método que admiten algunas clases, Finalize, se ejecuta automáticamente cuando se libera un objeto y
puede utilizarse para realizar otras tareas de limpieza. El método Finalize es similar al método
Class_Terminate() utilizado en versiones anteriores de Visual Basic. Después de que un objeto quede
inaccesible, CLR llamará en el futuro al método Finalize del objeto. Dado que el algoritmo de la recolección
Pág 48
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Pág 49
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Public Sub GetPicture(ByVal x As PictureBox)
Dim objX As PictureBox
' Assign the passed-in picture box to an object variable.
objX = x
' Assign the value of the Picture property to the Form1 picture
box.
objX.Image = PictureBox2.Image
End Sub
Visual Basic
Copiar código
Protected Sub Form1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim newForm2 As New Form2
newForm2.GetPicture(PictureBox1)
End Sub
9. Ejecute la aplicación y haga clic en Form1. La imagen de Form2 aparece en el cuadro de imagen de
Form1.
El procedimiento de evento Form1_Click llama al procedimiento GetPicture de Form2 y le pasa
el cuadro de imagen vacío. El procedimiento GetPicture de Form2 asigna la propiedad Image del
cuadro de imagen de Form2 al cuadro de imagen vacío de Form1, y la imagen de Form2 se muestra
en Form1.
Vea también
Conceptos
Administración de recursos
Otros recursos
Pág 50
Programación Orientada a Objetos en Visual Basic
Nota de seguridad:
En este ejemplo se crea un nuevo archivo, si el archivo no existe ya. Si una aplicación debe crear
un archivo, necesitará tener permisos Create en la carpeta correspondiente. Los permisos se
establecen usando listas de control de acceso. Sin embargo, si el archivo ya existe, la aplicación
sólo precisará el permiso de Write, un permiso menor. Por tanto, siempre que sea posible, resulta
más seguro crear el archivo durante la implementación y conceder sólo permisos Read a un único
archivo (en lugar de conceder permisos Create a una carpeta). También es más seguro escribir
datos en carpetas de usuario que en la carpeta raíz o en la carpeta Archivos de programa.
Nota de seguridad:
En este ejemplo se almacenan datos en un formato de archivo binario o SOAP. Estos formatos no
se deben usar con datos confidenciales, como contraseñas o información de la tarjeta de crédito.
Nota:
Los cuadros de diálogo y los comandos de menú que se ven pueden diferir de los descritos en la
Ayuda, dependiendo de los valores de configuración o de edición activos. Para cambiar su
configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para
obtener más información, vea Valores de configuración de Visual Studio.
Visual Basic
Copiar código
Pág 51
Programación Orientada a Objetos en Visual Basic
También tendrá que crear una aplicación simple que utilice la clase Loan.
Visual Basic
Copiar código
Private TestLoan As New LoanClass.Loan
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
TextBox1.Text = TestLoan.LoanAmount.ToString
TextBox2.Text = TestLoan.InterestRate.ToString
TextBox3.Text = TestLoan.Term.ToString
TextBox4.Text = TestLoan.Customer
End Sub
Llegado este punto, puede generar y ejecutar la aplicación. Observe que los valores predeterminados de la
clase Loan aparecen en los cuadros de texto. Pruebe a cambiar el valor del tipo de interés de 7,5 a 7,1 y, a
continuación, cierre la aplicación y ejecútela de nuevo; el valor vuelve a ser el predeterminado de 7,5.
En el mundo real, los tipos de interés cambian periódicamente, pero no forzosamente cada vez que se
ejecuta la aplicación. En lugar de hacer que el usuario actualice el tipo de interés cada vez que se ejecute la
aplicación, sería mejor guardar el tipo de interés más reciente entre las instancias de la aplicación. En el
paso siguiente, hará exactamente eso agregando la serialización a la clase Loan.
Usar serialización para guardar el objeto
Para guardar los valores de la clase Loan, primero debe marcarse la clase con el atributo Serializable.
Pág 52
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
<Serializable()> Public Class Loan
El atributo Serializable indica al compilador que todo el contenido de la clase se puede guardar en un
archivo. En este caso, es probable que sólo desee guardar el miembro InterestRate, y no los miembros
Customer, LoanAmount o Period. El atributo NonSerialized se puede utilizar para marcar miembros de
clase que no deberían guardarse. Por razones de simplicidad, en este ejemplo se guarda todo excepto el
miembro Customer.
Visual Basic
Copiar código
<NonSerialized()> Public Customer As String
El paso siguiente es agregar el código de serialización a la aplicación LoanApp. Para serializar la clase y
escribirla en un archivo, utilizará los espacios de nombres System.IO y System.Xml.Serialization. Para no
tener que escribir los nombres completos, puede usar la instrucción Imports.
Visual Basic
Copiar código
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
En este caso, está usando un formateador para guardar el objeto en un formato binario. Más
adelante en este tutorial modificará el código para guardar el objeto en un formato SOAP.
El paso siguiente es agregar código para deserializar el objeto del archivo cuando se cree.
Visual Basic
Copiar código
Const FileName As String = "SavedLoan.bin"
Pág 53
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
If File.Exists(FileName) Then
Dim TestFileStream As Stream = File.OpenRead(FileName)
Dim deserializer As New BinaryFormatter
TestLoan = CType(deserializer.Deserialize(TestFileStream),
LoanClass.Loan)
TestFileStream.Close()
End If
TextBox1.Text = TestLoan.LoanAmount.ToString
TextBox2.Text = TestLoan.InterestRate.ToString
TextBox3.Text = TestLoan.Term.ToString
TextBox4.Text = TestLoan.Customer
End Sub
Observe que primero tiene que comprobar que el archivo existe. Si es así, cree una clase Stream
para leer el archivo binario y una clase BinaryFormatter para traducirlo. El método CType se usa
para convertir del tipo de la secuencia al tipo del objeto Loan.
A continuación, tiene que agregar código para guardar los datos introducidos en los cuadros de texto de la
clase Loan y, a continuación, debe serializar la clase en un archivo.
Visual Basic
Copiar código
Private Sub Form1_Closing(ByVal sender As System.Object, ByVal e As
_
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
TestLoan.LoanAmount = CType(TextBox1.Text, Double)
TestLoan.InterestRate = CType(TextBox2.Text, Double)
TestLoan.Term = CType(TextBox3.Text, Integer)
TestLoan.Customer = TextBox4.Text
Pág 54
Programación Orientada a Objetos en Visual Basic
End Sub
Llegado este punto, puede volver a generar y ejecutar la aplicación. Inicialmente, los valores
predeterminados aparecen en los cuadros de texto. Pruebe a cambiar los valores e introducir un nombre en
el cuarto cuadro de texto. Cierre la aplicación y, a continuación, ejecútela de nuevo. Observe que los valores
nuevos aparecen ahora en los cuadros de texto, excepto el nombre del cliente que se marcó como
NonSerialized.
Guardar el objeto con un formato SOAP
En este ejemplo se ha mostrado hasta ahora cómo guardar un objeto en un archivo de texto usando un
formato binario, que resulta correcto para la mayoría de las aplicaciones Windows; sin embargo, para las
aplicaciones web o los servicios web XML, es conveniente guardar el objeto en un archivo XML mediante un
formato SOAP, que facilita compartir el objeto.
Para guardar el objeto en un formato SOAP, primero debe hacerse referencia a la clase SoapFormatter. La
clase SoapFormatter reside en su propio espacio de nombres:
System.Runtime.Serialization.Formatters.Soap.
Visual Basic
Copiar código
Imports System.Runtime.Serialization.Formatters.Soap
Visual Basic
Copiar código
Dim deserializer As New SoapFormatter
Visual Basic
Copiar código
Dim serializer As New SoapFormatter
Pág 55
Programación Orientada a Objetos en Visual Basic
Llegado este punto, puede generar y probar la aplicación. La primera vez que ejecute la aplicación, se creará
el archivo SavedLoan.xml. Para ver el archivo, elija la opción Mostrar todos los archivos en el Explorador de
soluciones; se encuentra en el nodo Bin del proyecto de aplicación para Windows.
Nota:
Si ya se encuentra en el modo Mostrar todos los archivos, para ver el archivo tendrá que actualizar
la vista; para ello, seleccione Actualizar en el menú Ver.
Observe que los tres miembros de la clase LoanClass se muestran en formato XML. Cambie el valor de
InterestRate en el archivo XML, a continuación guárdelo y ejecute la aplicación de nuevo. El nuevo tipo de
interés aparecerá en el segundo cuadro de texto.
Vea también
Conceptos
Equivalentes de PropertyBag para usuarios de Visual Basic 6.0
Fundamentos de la serialización de .NET Framework
Compilar el código
Este ejemplo necesita:
Una referencia al espacio de nombres System.
Nota:
Pág 56
Programación Orientada a Objetos en Visual Basic
Asegúrese de que la clase desde la que desea heredar no está definida como NotInheritable.
Vea también
Tareas
Cómo: Dibujar una forma con contorno
Referencia
NotInheritable
Otros recursos
Herencia en Visual Basic
Crear y utilizar objetos
Compilar el código
Sustituya el nombre de archivo "c:\IntroToVB.xml" por el nombre del archivo que contenga los datos
serializados. Para obtener más información sobre datos de serialización, consulte Cómo: Escribir datos de
objetos en un archivo XML de Visual Basic.
La clase debe tener un constructor público sin parámetros.
Sólo se deserializan propiedades y campos públicos.
Programación eficaz
Pág 57
Programación Orientada a Objetos en Visual Basic
Pág 58
Programación Orientada a Objetos en Visual Basic
Compilar el código
La clase debe tener un constructor público sin parámetros.
Programación eficaz
Las condiciones siguientes pueden producir una excepción:
La clase que se va a serializar no tiene un constructor público sin parámetros.
El archivo ya existe y es de sólo lectura (IOException).
La ruta de acceso es demasiado larga (PathTooLongException).
El disco está lleno (IOException).
Seguridad
Este ejemplo crea un nuevo archivo, si el archivo no existe ya. Si una aplicación necesita crear un archivo,
precisará acceso Create para la carpeta correspondiente. Sin embargo, si el archivo ya existe, la aplicación
sólo precisará acceso Write, un privilegio menor. Por tanto, siempre que sea posible, resulta más seguro
crear el archivo durante la implementación y conceder sólo acceso Read para un único archivo, en lugar de
acceso Create para una carpeta.
Vea también
Tareas
Cómo: Leer datos de objetos de un archivo XML en Visual Basic
Referencia
StreamWriter
Otros recursos
Acceso a archivos con Visual Basic
Pág 59
Programación Orientada a Objetos en Visual Basic
Una colección puede ser basada en cero o basada en uno, según cuál sea su índice de comienzo. La primera
de ellas significa que el índice del primer elemento de la colección es 0, y la última, que es 1. Un ejemplo de
colección basada en cero es la colección Controls de .NET Framework, explicada anteriormente en esta
página. El objeto Collection de Visual Basic es un ejemplo de una colección basada en uno.
Las colecciones basadas en uno pueden resultar más intuitivas para los usuarios de Visual Basic, porque el
intervalo del índice se extiende desde 1 hasta el valor de Count (Propiedad, objeto Collection), que devuelve
el número de elementos existentes en una colección. En cambio, el índice de una colección basada en cero
varía desde cero hasta el valor de la propiedad Count menos uno. Esto puede ser adecuado cuando los
valores de índice son desplazamientos respecto a un valor base o corresponder a miembros de una
enumeración basada en cero.
Las colecciones de .NET Framework están basadas en cero con el fin de seguir un esquema estándar. La
clase Collection de Visual Basic está basada en uno con el fin de proporcionar compatibilidad con versiones
anteriores.
Valores de índice y de clave
Las instancias de la clase Collection de Visual Basic permiten tener acceso a un elemento utilizando un índice
numérico o una clave String. Puede agregar elementos a los objetos Collection de Visual Basic especificando
una clave o sin especificarla. Si agrega un elemento sin una clave, debe utilizar su índice numérico para
tener acceso a él.
Por contraste, las colecciones como System.Collections..::.ArrayList sólo permiten un índice numérico. No se
pueden asociar claves con los elementos de estas colecciones, a menos que construya las suyas propias
basadas en asignaciones, por ejemplo, en una matriz de String que contiene las claves.
Agregar y quitar elementos
Las colecciones se diferencian en si se les puede o no agregar elementos y, en caso afirmativo, en cómo se
pueden agregar. Puesto que el objeto Collection de Visual Basic es una herramienta de programación de uso
general, es más flexible que algunas otras colecciones. Tiene un Add (Método, objeto Collection) para colocar
elementos en la colección y un Remove (Método, objeto Collection) para quitar elementos de ella.
Por otra parte, ciertas colecciones especializadas no permiten agregar o quitar elementos mediante código.
Por ejemplo, la propiedad CheckedListBox..::.CheckedItems devuelve una colección de referencias a
elementos por índice, pero su código no puede agregar elementos a la colección ni quitarlos de ella. Sólo el
usuario puede hacer esta operación, activando o desactivando la casilla de verificación correspondiente en la
interfaz de usuario. Por tanto, no hay ningún método Add ni Remove para esta colección.
Vea también
Tareas
Cómo: Crear una colección de objetos
Cómo: Crear una matriz de objetos
Cómo: Agregar, eliminar y recuperar los elementos de una colección
Cómo: Definir colecciones en clases propias
Cómo: Recorrer en iteración una colección de Visual Basic
Solucionar problemas de colecciones
Conceptos
Administrar grupos de objetos
Clase de colección de Visual Basic
Administrar objetos propios con colecciones
Pág 60
Programación Orientada a Objetos en Visual Basic
Pág 61
Programación Orientada a Objetos en Visual Basic
Pág 62
Programación Orientada a Objetos en Visual Basic
System.Collections
System.Collections.Generic
System.Collections.Specialized
Pág 63
Programación Orientada a Objetos en Visual Basic
Una colección mantiene las referencias a los objetos que controla pero no contiene los objetos en sí. Al
destruir un objeto Collection, por consiguiente, no se destruyen los objetos que controla. Cada objeto
individual que había sido un elemento de la colección continúa existiendo hasta que se marque
individualmente para la recolección de elementos no utilizados.
Trabajar con elementos
Los servicios básicos de agregar, eliminar y recuperar elementos de una colección dependen de claves e
índices. Una clave es un valor String. Podría ser un nombre, un número de permiso de conducción, un
número de teléfono o simplemente un entero convertido en una cadena. El método Add le permite asociar
una clave a un elemento, tal como se describe en Cómo: Agregar, eliminar y recuperar los elementos de una
colección.
Un índice en la clase Collection es un entero entre 1 y el número de elementos de la colección. Count
(Propiedad, objeto Collection) devuelve el número actual de elementos. Se puede controlar el valor inicial del
índice de un elemento mediante los parámetros Before y After, cuando llama a Add, pero su valor puede
cambiar cuando se agregan o eliminan otros elementos. Para obtener más información, consulte Add
(Método, objeto Collection).
Puede quitar un elemento único de una colección pasando su clave o su índice a Remove (Método, objeto
Collection). Puede vaciar una colección y quitar todos los elementos con Clear (Método, objeto Collection).
Tener acceso a elementos
Puede pasar un valor clave a Contains (Método, objeto Collection) para probar si una colección contiene un
elemento con esa clave. Puede recuperar un elemento pasando su clave o su índice a Item (Propiedad,
objeto Collection).
Puede utilizar valores de índice y la propiedad Item para recorrer en iteración los elementos de una colección
o puede utilizar Instrucción For Each...Next (Visual Basic). El ejemplo siguiente muestra dos maneras de
aplicar una subida del 10 por ciento a todos los empleados de una colección de objetos employee,
suponiendo que la variable employeesColl contiene una referencia a un objeto Collection.
Copiar código
Option Strict On
' The following alternative uses the Count and Item properties.
Dim emp As employee
For counter As Integer = 1 To employeesColl.Count
emp = CType(employeesColl.Item(counter), employee)
emp.payRate *= 1.1
Next counter
' The following alternative uses the For Each...Next statements.
For Each emp As employee In employeesColl
emp.payRate *= 1.1
Next emp
Sin embargo, si ha agregado uno o más elementos a employeesColl que no son de tipo employee, el bucle
For Each produce una excepción ArgumentException en tiempo de ejecución.
Tipo de datos de elementos
Un objeto de colección de Visual Basic almacena los elementos con el tipo de datos Object. Por consiguiente,
el intervalo de tipos de datos que puede agregar a un objeto Collection es igual al intervalo de tipos de datos
que puede almacenar en una variable Object. Ésta incluye tipos de datos estándar, objetos y matrices, así
como estructuras definidas por el usuario e instancias de clase.
Pág 64
Programación Orientada a Objetos en Visual Basic
Como el objeto Collection almacena los elementos como Object, la propiedad Item devuelve un valor Object.
Para utilizar el elemento en su código, debe convertir normalmente de Object al tipo de datos en tiempo de
ejecución del elemento. La manera de hacerlo depende de la configuración del modificador de comprobación
de tipos en Option Strict (Instrucción).
Conversión implícita desde el objeto
Si Option Strict es Off, puede convertir un elemento de Collection implícitamente a su tipo de datos
adecuado, tal como se muestra en el ejemplo siguiente.
Copiar código
Option Strict Off
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = sampleColl.Item(1)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to
String.
End Try
Conversión explícita desde el objeto
Si Option Strict es On, debe convertir explícitamente desde Object al tipo de datos en tiempo de ejecución
del elemento. Para obtener un elemento de Item de esta manera, puede utilizar CType (Función) para
realizar la conversión, tal como se muestra en el ejemplo siguiente.
Copiar código
Option Strict On
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = CType(sampleColl.Item(1), String)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to
String.
End Try
Servicios adicionales
Los métodos y propiedades del objeto Collection proporcionan solamente los servicios más básicos para
colecciones. Por ejemplo, el método Add no puede comprobar el tipo de un elemento que se agrega a una
colección, comprobación que puede resultar deseable para asegurarnos de que la colección contiene
únicamente una clase de elementos. Si puede garantizar esto en el método Add, tiene una colección con
Pág 65
Programación Orientada a Objetos en Visual Basic
establecimiento inflexible de tipos y no tiene que convertir el valor devuelto de la propiedad Item a su tipo
de datos en tiempo de ejecución. Esto mejora el rendimiento.
Puede proporcionar una funcionalidad más robusta (y propiedades, métodos y eventos adicionales) creando
su propia clase de colección, tal como se describe en Cómo: Definir colecciones en clases propias.
Vea también
Conceptos
Colecciones como alternativa a las matrices
Colecciones en Visual Basic
Referencia
Collection (Objeto, Visual Basic)
Copiar código
Public Class widgetRepository
Public widgetColl As New Microsoft.VisualBasic.Collection()
' Insert code to implement additional functionality.
End Class
La clase widgetRepository tiene ahora una colección pública a la que se pueden agregar objetos
widget. Puede utilizar Instrucción For Each...Next (Visual Basic) para procesar los elementos de
colección, como muestra el código siguiente.
Copiar código
For Each aWidget As widget In widgetColl
' Insert code to process widgetColl elements
Next aWidget
La colección widgetColl definida en el ejemplo anterior no es con establecimiento inflexible de
tipos, lo que significa que puede agregar cualquier tipo de objeto, no sólo objetos widget. Esto
puede conducir a problemas de seguridad de tipos. Por ejemplo, suponga que agrega String a la
colección, como en el código siguiente.
Copiar código
Dim notWidget As String = "This is not a widget object!"
widgetColl.Add(notWidget)
Pág 66
Programación Orientada a Objetos en Visual Basic
Si hace esto, el bucle For Each del procedimiento anterior produce una excepción
ArgumentException en tiempo de ejecución porque un elemento de la colección no es de tipo
widget.
Se recomienda definir una clase genérica cuando se desea garantizar la seguridad de tipos. Para
obtener más información y un ejemplo, consulte Cómo: Definir colecciones con seguridad de tipos.
Vea también
Tareas
Cómo: Definir colecciones con seguridad de tipos
Conceptos
Clase de colección de Visual Basic
Colecciones en Visual Basic
Tipos genéricos en Visual Basic
Referencia
Option Strict (Instrucción)
Sin embargo, esta colección widgetColl no dispone de establecimiento inflexible de tipos. En ella puede
agregar cualquier tipo de elemento, no sólo objetos widget. Cuando recupera un elemento, puede que deba
intentar convertirlo en widget. Esto puede conducir a problemas de seguridad de tipos. Por ejemplo,
suponga que agrega un objeto tipo String a la colección con el código siguiente.
Visual Basic
Copiar código
Dim notWidget As String = "This is not a widget object!"
widgetColl.Add(notWidget)
En este caso, un intento posterior de recuperar dicho elemento produce una excepción ArgumentException
en tiempo de ejecución ya que el elemento de la colección no es del tipo widget.
Protección contra los problemas de seguridad de tipos
Recomendamos que aumente la seguridad de tipos definiendo una clase genérica. Así se exige el
establecimiento inflexible de tipos se consigue flexibilidad en el tipo de datos concreto con el que trabaja.
Para obtener más información, vea Tipos genéricos en Visual Basic.
Pág 67
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Public widgetColl As New System.Collections.Generic.List(Of widget)
En este caso, el establecimiento inflexible de tipos sólo permite agregar elementos widget a la
colección y cada elemento que se recupera por medio de la propiedad Item es un objeto widget.
Debido al establecimiento inflexible de tipos, el código de recuperación también puede utilizar todas
las propiedades y los métodos expuestos por widget.
O bien
Cree su propia clase de colección sin utilizar ninguna clase predefinida. Restrinja el método Add
para que sólo acepte objetos widget e implemente la propiedad Item con un tipo de valor devuelto
de widget. Para obtener más información, vea Cómo: Definir colecciones con seguridad de tipos.
Si Item devuelve elementos de tipo Object, sólo tendría acceso explícito a las propiedades y
métodos definidos en la clase Object. Para tener acceso a los miembros de widget, debería activar
Option Strict Off o utilizar CType (Función) para convertir de forma explícita el elemento devuelto a
widget, como en el código siguiente.
Visual Basic
Copiar código
Dim nextWidget As widget
Try
nextWidget = CType(widgetColl.Item(1), widget)
Catch ex As Exception
' Insert code to run if the collection item is not a widget.
End Try
En cualquiera de los casos, si utiliza los elementos Object de esta manera, Visual Basic emplea el
enlace en tiempo de ejecución, lo que reduce el rendimiento.
Tenga en cuenta que la clase Collection de Visual Basic acepta y devuelve elementos Object, por lo
que también tiene las desventajas de los tipos flexibles y el enlace en tiempo de ejecución.
Vea también
Conceptos
Clase de colección de Visual Basic
Colecciones en Visual Basic
Tipos genéricos en Visual Basic
Referencia
System.Collections
Pág 68
Programación Orientada a Objetos en Visual Basic
System.Collections.Generic
System.Collections.Specialized
Option Strict (Instrucción)
Contraer todo
Filtro de idioma : Todos
Esta página es específica de
Microsoft Visual Studio 2008/.NET Framework 3.5
Hay además otras versiones disponibles para:
Copiar código
Dim sampleVisualBasicColl As New Microsoft.VisualBasic.Collection()
La colección de sampleVisualBasicColl puede aceptar elementos de cualquier tipo de datos.
2. Utilice Add (Método, objeto Collection) para agregar elementos a la colección. El ejemplo siguiente
crea cuatro elementos String y los agrega a la colección. Crea un valor String único como clave para
cada nuevo elemento y lo pasa al método Add.
Copiar código
Dim item1, item2, item3, item4 As String
item1 = "Items"
item2 = "In"
item3 = "A"
item4 = "Collection"
sampleVisualBasicColl.Add(item1, "firstkey")
Pág 69
Programación Orientada a Objetos en Visual Basic
sampleVisualBasicColl.Add(item2, "secondkey")
sampleVisualBasicColl.Add(item3, "thirdkey")
sampleVisualBasicColl.Add(item4, "fourthkey")
El argumento Key es opcional en una colección de Visual Basic.
3. Si desea quitar un elemento de la colección, puede utilizar Remove (Método, objeto Collection)
identificando el elemento por su índice posicional o por su clave opcional. Esto se ilustra en el
siguiente ejemplo:
Copiar código
' Remove the first element of the Visual Basic collection.
sampleVisualBasicColl.Remove(1)
' Remove the element with the key "secondkey".
sampleVisualBasicColl.Remove("secondkey")
Tenga en cuenta que al quitar un elemento de Visual BasicCollection, los valores del índice se
numeran desde 1 hasta el valor de Count (Propiedad, objeto Collection).
Para utilizar For Each...Next para procesar los elementos de la colección de Visual
Basic
1. Declare una variable del tipo almacenado en la colección. Para obtener el ejemplo anterior, declare
una variable de tipo String, tal como muestra el ejemplo siguiente.
Copiar código
' Insert code from the preceding example.
Dim aString As String
2. Utilice Instrucción For Each...Next (Visual Basic) para examinar cada elemento de la colección. El
ejemplo siguiente busca una cadena determinada y la muestra si la encuentra.
Copiar código
For Each aString in sampleVisualBasicColl
If aString = "Collection" Then
MsgBox(aString)
End If
Next aString
Copiar código
Dim sampleGenericColl As New
System.Collections.Generic.Dictionary(Of String, String)
La variable sampleGenericColl contiene una colección de tipo seguro que sólo acepta elementos y
claves de tipo String.
Pág 70
Programación Orientada a Objetos en Visual Basic
Copiar código
Dim item1, item2, item3, item4 As String
item1 = "Items"
item2 = "In"
item3 = "A"
item4 = "Collection"
sampleGenericColl.Add("firstkey", item1)
sampleGenericColl.Add("secondkey", item2)
sampleGenericColl.Add("thirdkey", item3)
sampleGenericColl.Add("fourthkey", item4)
Se requiere el argumento Key en esta colección genérica.
3. Para quitar un elemento de la colección, utilice el método IDictionary(TKey, TValue).Remove. Debe
proporcionar la clave para identificar el elemento que se va a quitar. Esto se ilustra en el siguiente
ejemplo:
Copiar código
If Not sampleGenericColl.Remove("thirdkey")
' Insert code to handle "thirdkey" not found in collection.
End If
Puede utilizar una instrucción For Each...Next para recorrer en iteración y procesar los elementos de
una colección, como muestra el procedimiento siguiente.
Para utilizar For Each...Next para procesar los elementos de la colección genérica
1. Declare una variable del tipo almacenado en la colección. Para obtener el ejemplo anterior, declare
una variable de tipo String, tal como muestra el ejemplo siguiente.
Copiar código
' Insert code from the preceding example.
Dim aPair As KeyValuePair(Of String, String)
2. Utilice Instrucción For Each...Next (Visual Basic) para examinar cada elemento de la colección. El
ejemplo siguiente busca una cadena determinada y la muestra si la encuentra.
Copiar código
For Each aPair In sampleGenericColl
If aPair.Value = "Items" Then
MsgBox(aPair.Key & " -- " & aPair.Value)
End If
Next aPair
Vea también
Tareas
Pág 71
Programación Orientada a Objetos en Visual Basic
Copiar código
Dim x(10) As widget
' x now contains 11 elements of type widget, x(0) through x(10).
2. Cree los elementos de la matriz o asigne a cada elemento una referencia a un objeto ya existente.
En el siguiente ejemplo se muestra cómo.
Copiar código
' Create each element of an array by using a loop.
For q As Integer = 0 To 10
x(q) = New widget()
Next q
' Assign a reference to an existing object to two array elements.
Dim specialWidget As New widget()
x(0) = specialWidget
x(1) = specialWidget
Observe que puede asignar referencias al mismo objeto a distintos elementos de la matriz.
Vea también
Tareas
Cómo: Crear una colección de objetos
Conceptos
Administrar grupos de objetos
Tipos de valores y tipos de referencia
Pág 72
Programación Orientada a Objetos en Visual Basic
Otros recursos
Matrices en Visual Basic
Contraer todo
Filtro de idioma : Todos
Esta página es específica de
Microsoft Visual Studio 2008/.NET Framework 3.5
Hay además otras versiones disponibles para:
Nota:
Los objetos Collection actualizan sus números de índice numéricos automáticamente cuando
agrega y elimina elementos. Por ello, el índice numérico de un elemento determinado puede
cambiar a menudo. Por ello, cuando guarde un valor de índice numérico, no espere recuperar el
mismo elemento posteriormente en el programa. Para este propósito utilice claves.
Copiar código
workOrders.Add(woNew, woNew.ID)
La llamada anterior supone que la propiedad ID es una cadena. Si es un número (por ejemplo, un
entero Long ), utilice su método ToString para convertirlo en el valor String necesario para el
argumento Key.
Copiar código
workOrders.Add(woNew, woNew.ID.ToString())
El uso de una clave es opcional. Si no desea asociar una clave al objeto de su colección, puede
agregarlo sin una clave.
Copiar código
Pág 73
Programación Orientada a Objetos en Visual Basic
workOrders.Add(woNew)
Puede utilizar los argumentos Before y After para mantener una colección ordenada de objetos. El
miembro que se agrega se coloca en la colección antes o después del miembro identificado por el
argumento Before o After respectivamente. Por ejemplo, si estable Before igual a 1, se inserta un
elemento al principio de la colección porque los objetos Collection están basados en 1.
Copiar código
workOrders.Add(woNew, woNew.ID, 1)
De forma similar, el argumento After agrega un elemento después del índice especificado. El
siguiente ejemplo agrega un tercer elemento.
Copiar código
workOrders.Add(woNew, woNew.ID,,2)
Se puede especificar un valor para Before o para After, pero no para ambos.
Copiar código
workOrders.Remove(3)
workOrders.Remove("W017493")
Copiar código
woCurrent = workOrders.Item(3)
woCurrent = workOrders.Item("W017493")
Nota:
Si utiliza números como claves, debe utilizar sus métodos ToString para convertirlos en las
Pág 74
Programación Orientada a Objetos en Visual Basic
cadenas antes de pasarlos al método Add o Remove o a la propiedad Item. Un objeto de Visual
BasicCollection supone siempre que un número es un índice, en vez de una cadena de clave.
Copiar código
woCurrent = workOrders!W017493
Vea también
Conceptos
Clase de colección de Visual Basic
Colecciones como alternativa a las matrices
Colecciones en Visual Basic
Referencia
Collection (Miembros del objeto)
Add (Método, objeto Collection)
Remove (Método, objeto Collection)
Clear (Método, objeto Collection)
Item (Propiedad, objeto Collection)
Contraer todo
Pág 75
Programación Orientada a Objetos en Visual Basic
Pág 76
Programación Orientada a Objetos en Visual Basic
Enfoque correcto
Determine qué tipo de colección es más adecuado para sus necesidades. Declare su variable de colección
para que sea de ese tipo y asegúrese de crear un objeto de ese mismo tipo. Utilice la calificación completa
para asegurarse de que está especificando el tipo de colección deseado. El ejemplo siguiente muestra dos
declaraciones con calificación completa.
Visual Basic
Copiar código
Dim customers As New Microsoft.VisualBasic.Collection()
Dim stringQueue As New System.Collections.Generic.Queue(Of String)
Una vez creada una colección de un tipo específico, asegúrese de utilizar sólo los métodos y propiedades
definidos en ese tipo. Establezca Option Strict On para detectar cualquier asignación incorrecta de objeto o
acceso a miembro en tiempo de compilación.
Vea también
Conceptos
Colecciones en Visual Basic
Clase de colección de Visual Basic
Referencia
Option Strict (Instrucción)
Pág 77
Programación Orientada a Objetos en Visual Basic
Pág 78
Programación Orientada a Objetos en Visual Basic
Producir eventos
Un evento es como un mensaje que anuncia que ha pasado algo importante. A la acción de difundir el
mensaje se le llama producir el evento. En Visual Basic, los eventos se producen con la instrucción
RaiseEvent, como en el ejemplo siguiente:
Visual Basic
Copiar código
RaiseEvent AnEvent(EventNumber)
Los eventos se deben provocar dentro del ámbito de la clase, módulo o estructura donde se declaran. Por
ejemplo, una clase derivada no puede producir eventos heredados de una clase base.
Remitentes de eventos
Cualquier objeto capaz de producir un evento es un remitente de eventos, y también recibe el nombre de
origen de eventos. Los formularios, controles y objetos definidos por el usuario son ejemplos de remitentes
de eventos.
Controladores de eventos
Los controladores de eventos son procedimientos llamados cuando se produce un evento correspondiente.
Puede utilizar cualquier subrutina válida con una firma coincidente como controlador de eventos. No
obstante, no puede utilizar una función como controlador de eventos, porque no puede devolver un valor al
origen del evento.
Visual Basic utiliza una convención de nomenclatura estándar para controladores de eventos que combina el
nombre del remitente del evento, un signo de subrayado y el nombre del evento. Por ejemplo, el evento
Click de un botón denominado button1 recibiría el nombre de Sub button1_Click.
Nota:
Pág 79
Programación Orientada a Objetos en Visual Basic
Copiar código
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
End Sub
Vea también
Tareas
Cómo: Escribir controladores de eventos
Conceptos
AddHandler y RemoveHandler
WithEvents y la cláusula Handles
Referencia
Handles
AddHandler (Instrucción)
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
Pág 80
Programación Orientada a Objetos en Visual Basic
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
La instrucción WithEvents y la cláusula Handles son a menudo la mejor opción para los controladores de
eventos, ya que la sintaxis declarativa que utilizan hace que el control de eventos sea más sencillo de
codificar, leer y depurar. No obstante, tenga en cuenta las siguientes limitaciones en la utilización de las
variables WithEvents:
No se puede utilizar una variable WithEvents como variable de objeto. Es decir, no es posible
declararla como Object; se debe especificar el nombre de clase al declarar la variable.
Dado que los eventos compartidos no están asociados a instancias de clase, no se puede usar
WithEvents para controlar los eventos mediante declaraciones compartidas. De forma parecida, no
se puede utilizar WithEvents ni Handles para controlar los eventos desde una estructura
Structure. En ambos casos, puede utilizar la instrucción AddHandler para controlar esos eventos.
No se pueden crear matrices de variables WithEvents.
Las variables WithEvents permiten que un solo controlador controle uno o más tipos de eventos,
así como que uno o más controladores de eventos controlen el mismo tipo de evento.
Vea también
Conceptos
AddHandler y RemoveHandler
Referencia
Handles
WithEvents
AddHandler (Instrucción)
AddHandler y RemoveHandler
Actualización: noviembre 2007
La instrucción AddHandler se parece a la cláusula Handles en que las dos permiten especificar un
controlador de eventos. Sin embargo, AddHandler, utilizado con RemoveHandler, proporciona más
flexibilidad que la cláusula Handles, lo que permite agregar, quitar y cambiar de forma dinámica el
controlador de errores asociado con un evento. Si desea controlar eventos compartidos o eventos de una
estructura, debe utilizar AddHandler.
AddHandler toma dos argumentos: el nombre de un evento de un remitente de evento, como un control, y
una expresión que evalúa a un delegado. No necesita especificar explícitamente la clase delegada al utilizar
AddHandler, ya que la instrucción AddressOf siempre devuelve una referencia al delegado. El ejemplo
siguiente asocia un controlador de eventos a un evento provocado por un objeto:
Visual Basic
Copiar código
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler, que desconecta un evento de un controlador de eventos, utiliza la misma sintaxis que
AddHandler. Por ejemplo:
Visual Basic
Copiar código
Pág 81
Programación Orientada a Objetos en Visual Basic
Vea también
Tareas
Cómo: Escribir controladores de eventos
Conceptos
Eventos y controladores de eventos
WithEvents y la cláusula Handles
Referencia
AddHandler (Instrucción)
Contraer todo
Filtro de idioma : Todos
Esta página es específica de
Microsoft Visual Studio 2008/.NET Framework 3.5
Hay además otras versiones disponibles para:
Nota:
Visual Basic
Copiar código
Public Event PercentDone(ByVal Percent As Single, _
ByRef Cancel As Boolean)
Vea también
Tareas
Pág 82
Programación Orientada a Objetos en Visual Basic
Pág 83
Programación Orientada a Objetos en Visual Basic
Este ejemplo de código también está disponible como fragmento de código de IntelliSense. En el selector de
fragmentos de código, se encuentra en Lenguaje Visual Basic. Para obtener más información, vea Cómo:
Insertar fragmentos de código en el código (Visual Basic).
Compilar el código
Para este ejemplo se necesita:
Acceso a los miembros del espacio de nombres System. Agregue una instrucción Imports si no
incluye nombres de miembro completos en el código. Para obtener más información, vea
Instrucción Imports (Tipo y espacio de nombres de .NET).
La instrucción Event debe estar en el nivel de la clase, no dentro de ningún procedimiento.
La instrucción RaiseEvent debe estar dentro de algún procedimiento de la aplicación.
Vea también
Tareas
Cómo: Crear un evento y un controlador (Visual Basic)
Conceptos
Eventos y controladores de eventos
Referencia
Event (Instrucción)
RaiseEvent (Instrucción)
Otros recursos
Eventos en Visual Basic
Pág 84
Programación Orientada a Objetos en Visual Basic
Compilar el código
Para este ejemplo se necesita:
Acceso a los miembros del espacio de nombres System. Agregue una instrucción Imports si no
incluye nombres de miembro completos en el código. Para obtener más información, vea
Instrucción Imports (Tipo y espacio de nombres de .NET).
La instrucción Event debe estar en el nivel de la clase, no dentro de ningún procedimiento.
La instrucción Event y ambos procedimientos (HandleTimeExpired y SetUpEventHandler)
deben estar definidos en la misma clase o el mismo módulo. De lo contrario, la instrucción
AddHandler debe calificar el evento y el controlador para los objetos en los que están definidos.
Vea también
Tareas
Cómo: Provocar un evento (Visual Basic)
Conceptos
Eventos y controladores de eventos
Referencia
Event (Instrucción)
AddHandler (Instrucción)
Otros recursos
Eventos en Visual Basic
Visual Basic
Copiar código
Class Class1
Pág 85
Programación Orientada a Objetos en Visual Basic
2. En la clase o el módulo que controlará el evento, utilice la palabra clave WithEvents para declarar
una variable de objeto para el código fuente de los eventos, como en el ejemplo siguiente:
Visual Basic
Copiar código
Public WithEvents ClassInst As Class1
3. En el Editor de código, elija la variable WithEvents que acaba de declarar en la lista desplegable
Nombre de clase de la parte izquierda.
4. Elija el evento que desea controlar de la lista desplegable Method Name en la parte derecha. El
Editor de código crea el procedimiento controlador de eventos vacío con una cláusula Handles.
Nota:
Este paso es opcional. Puede crear el procedimiento controlador de eventos de forma manual
mientras el procedimiento que se crea sea una subrutina, tenga la lista de argumentos correcta
para que coincida con el evento que se controla y tenga una cláusula Handles que especifique el
evento que se controla.
Visual Basic
Copiar código
Public Sub ClassInst_AnEvent(ByVal EventNumber As Integer) _
Handles ClassInst.AnEvent
MsgBox("Received event number: " & CStr(EventNumber))
End Sub
Visual Basic
Copiar código
Public Sub EHandler(ByVal EventNumber As Integer)
MsgBox("Received event number " & CStr(EventNumber))
Pág 86
Programación Orientada a Objetos en Visual Basic
End Sub
2. Declare una variable de objeto de la clase que sea el origen de los eventos y que desea controlar. A
diferencia de la variable WithEvents, puede ser una variable local en un procedimiento. Por
ejemplo:
Visual Basic
Copiar código
Public Sub TestAddHandler()
Dim CI As New Class1
End Sub
3. Utilice la instrucción AddHandler para especificar el nombre del remitente del evento, y la
instrucción AddressOf para proporcionar el nombre del controlador de eventos. Por ejemplo,
agregue el código siguiente al final de la subrutina TestAddHandler:
Visual Basic
Copiar código
AddHandler CI.AnEvent, AddressOf EHandler
Cualquier procedimiento puede servir como controlador de eventos siempre que admita los
argumentos correctos para el evento que se controla.
Utilizar RemoveHandler para detener el control de eventos
Puede utilizar la instrucción RemoveHandler para desconectar de forma dinámica eventos de
procedimientos controladores de eventos.
Visual Basic
Copiar código
RemoveHandler CI.AnEvent, AddressOf EHandler
Pág 87
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Public Class BaseClass
Public Event BaseEvent(ByVal i As Integer)
' Place methods and properties here.
End Class
Vea también
Conceptos
Eventos y controladores de eventos
Los delegados y el operador AddressOf
AddHandler y RemoveHandler
Referencia
Handles
AddHandler (Instrucción)
Pág 88
Programación Orientada a Objetos en Visual Basic
Vea también
Tareas
Cómo: Escribir controladores de eventos
Conceptos
Eventos y controladores de eventos
Los delegados y el operador AddressOf
AddHandler y RemoveHandler
Pág 89
Programación Orientada a Objetos en Visual Basic
4. En el menú Proyecto, elija Agregar clase para agregar al proyecto una clase denominada
Widget.vb.
Visual Basic
Copiar código
Public Event PercentDone(ByVal Percent As Single, _
ByRef Cancel As Boolean)
Cuando el objeto de llamada recibe un evento PercentDone, el argumento Percent contiene el porcentaje
de la tarea que se ha finalizado. El argumento Cancel se puede establecer en True para cancelar el método
que provocó el evento.
Nota:
Los argumentos de eventos se pueden declarar igual que se hace con los argumentos de
procedimientos, con las siguientes excepciones: los eventos no pueden tener argumentos
Optional, ParamArray, ni valores devueltos.
El evento PercentDone lo produce el método LongTask de la clase Widget. LongTask acepta dos
argumentos: el período de tiempo durante el cual el método simulará trabajar y el intervalo de tiempo
mínimo antes de que LongTask se detenga para provocar el evento PercentDone.
Visual Basic
Copiar código
Pág 90
Programación Orientada a Objetos en Visual Basic
Imports Microsoft.VisualBasic.DateAndTime
Visual Basic
Copiar código
Public Sub LongTask(ByVal Duration As Single, _
ByVal MinimumInterval As Single)
Dim Threshold As Single
Dim Start As Single
Dim blnCancel As Boolean
Cuando su aplicación llama al método LongTask, la clase Widget provoca el evento PercentDone cada vez
que transcurran los especificados en MinimumInterval. Cuando se vuelve del evento, LongTask
comprueba si se estableció en True el argumento Cancel.
En este punto son necesarias algunas aclaraciones. Para simplificar, en el procedimiento LongTask se
supone que el usuario conoce de antemano cuánto tarda en realizarse la tarea. Esto casi nunca es así.
Dividir las tareas en bloques del mismo tamaño puede resultar difícil y, a menudo, lo que es más importante
para los usuarios es simplemente el tiempo que transcurre antes de recibir una indicación de que algo está
ocurriendo.
También puede haber detectado otro error en este ejemplo. La propiedad Timer devuelve el número de
segundos transcurridos desde medianoche; por lo tanto, la aplicación se bloquea si se inicia inmediatamente
Pág 91
Programación Orientada a Objetos en Visual Basic
antes de medianoche. Una forma más cuidadosa de medir el tiempo tendría en cuenta condiciones de límite
como ésta, o las evitaría globalmente utilizando propiedades como Now.
Ahora que la clase Widget puede provocar eventos, puede continuar con el siguiente tutorial. Tutorial:
Controlar eventos explica cómo utilizar WithEvents para asociar un controlador de eventos con el evento
PercentDone.
Vea también
Tareas
Tutorial: Controlar eventos
Cómo: Escribir controladores de eventos
Conceptos
Eventos y controladores de eventos
Los delegados y el operador AddressOf
AddHandler y RemoveHandler
Referencia
Timer (Propiedad)
WithEvents
Now (Propiedad)
Event (Instrucción)
ByVal
ByRef
Instrucción Imports (Tipo y espacio de nombres de .NET)
Visual Basic
Copiar código
Private WithEvents mWidget As Widget
Private mblnCancel As Boolean
La palabra clave WithEvents especifica que se utiliza la variable mWidget para controlar los
eventos de un objeto. Puede especificar el tipo de objeto proporcionando el nombre de la clase de la
que se creará el objeto.
La variable mWidget se declara en Form1 porque las variables WithEvents deben ser de nivel de
clase. Esto es cierto independientemente del tipo de módulo donde se coloquen.
Pág 92
Programación Orientada a Objetos en Visual Basic
Nota:
El Editor de código es útil, pero no necesario, para insertar los nuevos controladores de eventos.
En este tutorial, es más directo copiar simplemente los controladores de eventos en el código.
Visual Basic
Copiar código
Private Sub mWidget_PercentDone( _
ByVal Percent As Single, _
ByRef Cancel As Boolean _
) Handles mWidget.PercentDone
lblPercentDone.Text = CInt(100 * Percent) & "%"
My.Application.DoEvents()
If mblnCancel Then Cancel = True
End Sub
Visual Basic
Copiar código
Private Sub Button2_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Button2.Click
mblnCancel = True
End Sub
Pág 93
Programación Orientada a Objetos en Visual Basic
Si el usuario hace clic en el botón Cancel cuando se está ejecutando LongTask, se ejecuta el evento
Button2_Click tan pronto como la instrucción DoEvents permite que se produzca el procesamiento de
eventos. La variable mblnCancel de nivel de clase se establece como True y el evento
mWidget_PercentDone lo comprueba luego y establece el argumento ByRef Cancel como True.
Conectar la variable WithEvents con un objeto
Form1 está ahora configurado para controlar los eventos de un objeto Widget. Sólo queda buscar un objeto
Widget en alguna parte.
Cuando declara una variable WithEvents en tiempo de diseño, no se asocia ningún objeto a ésta. La
variable WithEvents es como cualquier otra variable de objeto. Tendrá que crear un objeto y asignar una
referencia a éste con la variable WithEvents.
Visual Basic
Copiar código
Private Sub Form1_Load( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load
mWidget = New Widget
End Sub
Cuando se ejecuta este código, Visual Basic crea un objeto Widget y conecta sus eventos a los
procedimientos de evento asociados con mWidget. Desde este momento en adelante, siempre que el objeto
Widget provoque el evento PercentDone, se ejecutará el procedimiento de evento mWidget_PercentDone.
Visual Basic
Copiar código
Private Sub Button1_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Button1.Click
mblnCancel = False
lblPercentDone.Text = "0%"
Pág 94
Programación Orientada a Objetos en Visual Basic
lblPercentDone.Refresh()
mWidget.LongTask(12.2, 0.33)
If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
End Sub
Antes de llamar al método LongTask, la etiqueta que muestra el porcentaje completo debe inicializarse y el
indicador Boolean de nivel de clase que cancela el método debe establecerse como False.
LongTask se llama con una duración de tarea de 12,2 segundos. Se provoca el evento PercentDone una
vez cada tercio de segundo. Cada vez que se provoca el evento, se ejecuta el procedimiento de evento
mWidget_PercentDone.
Cuando termina LongTask, se comprueba mblnCancel para ver si LongTask ha finalizado de forma normal
o si se ha detenido porque mblnCancel estaba establecido como True. El porcentaje completo se actualiza
sólo en el primer caso.
Nota:
Puede resultarle instructivo ejecutar el programa con F11 y recorrer el código línea a línea. Puede ver
claramente cómo la ejecución escribe LongTask y luego vuelve a escribir Form1 brevemente cada vez que
se provoca el evento PercentDone.
¿Qué sucedería si cuando se estaba devolviendo la ejecución al código de Form1, se llamara al método
LongTask de nuevo? En el peor de los casos, podría ocurrir un desbordamiento de la pila si se llamara a
LongTask cada vez que se provocara el evento.
Puede hacer que la variable mWidget controle los eventos de un objeto Widget distinto asignando una
referencia al nuevo Widget con mWidget. De hecho, puede hacer que el código de Button1_Click realice
esto cada vez que hace clic en el botón.
Visual Basic
Copiar código
mWidget = New Widget
Pág 95
Programación Orientada a Objetos en Visual Basic
El código anterior crea un nuevo Widget cada vez que se hace clic en el botón. Tan pronto como finaliza el
método LongTask, se libera la referencia al objeto Widget y se destruye éste.
Las variables WithEvents pueden contener sólo una referencia a objeto a la vez, de modo que si asigna otro
objeto Widget a mWidget, los eventos del objeto Widget anterior ya no se controlarán. Si mWidget es la
única variable de objeto que contiene una referencia al objeto Widget antiguo, éste se destruirá. Si desea
controlar eventos desde varios objetos Widget, utilice la instrucción AddHandler para procesar
independientemente los eventos de cada objeto.
Nota:
Puede declarar todas las variables WithEvents que sean necesarias, pero no se admiten las
matrices de variables WithEvents.
Vea también
Tareas
Tutorial: Declarar y provocar eventos
Cómo: Escribir controladores de eventos
Conceptos
Eventos y controladores de eventos
Los delegados y el operador AddressOf
AddHandler y RemoveHandler
Referencia
Handles
WithEvents
Otros recursos
Polimorfismo
Pág 96
Programación Orientada a Objetos en Visual Basic
Vea también
Tareas
Cómo: Declarar eventos que evitan que se pierda memoria
Referencia
Event (Instrucción)
ArrayList
BeginInvoke
Pág 97
Programación Orientada a Objetos en Visual Basic
En lugar de utilizar la implementación predeterminada de los eventos que Visual Basic proporciona, puede
utilizar los eventos personalizados para administrar más cuidadosamente el uso de memoria.
Ejemplo
En este ejemplo, la clase utiliza una instancia de la clase EventHandlerList, almacenada en el campo Events,
para guardar información sobre los eventos que están en uso. La clase EventHandlerList es una clase de lista
optimizada diseñada para contener delegados.
Todos los eventos de la clase usan el campo Events para realizar un seguimiento de qué métodos está
controlando cada evento.
Visual Basic
Copiar código
Public Class MemoryOptimizedBaseControl
' Define a delegate store for all event handlers.
Private Events As New System.ComponentModel.EventHandlerList
' Define the Click event to use the same delegate store.
Public Custom Event DoubleClick As EventHandler
AddHandler(ByVal value As EventHandler)
Events.AddHandler("DoubleClickEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Events.RemoveHandler("DoubleClickEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
CType(Events("DoubleClickEvent"),
EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
Pág 98
Programación Orientada a Objetos en Visual Basic
' ...
End Class
Vea también
Tareas
Cómo: Declarar eventos que evitan bloqueos
Referencia
Event (Instrucción)
EventHandlerList
Visual Basic
Copiar código
' INCORRECT
Protected Overrides Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Pág 99
Programación Orientada a Objetos en Visual Basic
Si el método heredado no tiene una palabra clave Handles, compruebe que el código no contiene
una instrucción AddHandler (Instrucción) o métodos adicionales que controlen el mismo evento.
Vea también
Tareas
Cómo: Escribir controladores de eventos
Conceptos
Eventos y controladores de eventos
Cómo: Controlar eventos en Visual Basic
Otros recursos
Eventos en Visual Basic
Pág 100
Programación Orientada a Objetos en Visual Basic
Desafortunadamente, el objeto que provoca los eventos no puede saber por adelantado qué controlador de
eventos controla un evento específico. Visual Basic permite asociar dinámicamente los controladores de
eventos a los eventos creando un delegado para el usuario cuando usa la instrucción AddHandler. En tiempo
de ejecución, el delegado remite las llamadas al controlador de eventos adecuado.
Aunque puede crear sus propios delegados, en la mayoría de los casos Visual Basic crea el delegado y se
ocupa de los detalles. Por ejemplo, una instrucción Event define de forma implícita una clase delegada
denominada <EventName>EventHandler como clase anidada de la clase que contiene la instrucción Event,
y con la misma firma que el evento. La instrucción AddressOf crea de forma implícita una instancia de un
delegado. Por ejemplo, las siguientes dos líneas de código son equivalentes:
Visual Basic
Copiar código
AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
Puede utilizar el método abreviado para crear delegados en cualquier lugar donde el compilador pueda
determinar el tipo de delegado por el contexto.
Declarar eventos que utilicen un tipo de delegado existente
En algunas situaciones, puede que desee declarar un evento para que utilice un tipo de delegado existente
como delegado subyacente. La sintaxis siguiente describe cómo hacerlo:
Visual Basic
Copiar código
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Esto resulta útil cuando se desea enrutar diversos eventos hacia el mismo controlador.
Variables delegadas y parámetros
Puede utilizar delegados para otras tareas, no relacionadas con eventos, como un subprocesamiento libre o
con procedimientos que necesiten llamar a diferentes versiones de funciones en tiempo de compilación.
Por ejemplo, suponga que tiene una aplicación de anuncio clasificado que incluye un cuadro de lista con
nombres de coches. Los anuncios están ordenados por títulos, que normalmente son las marcas de los
coches. Un problema con el que puede encontrarse se produce cuando algunos coches incluyen el año del
coche antes de la marca. El problema es que la funcionalidad de ordenación integrada del cuadro de lista
ordena únicamente por códigos de carácter; primero coloca todos los anuncios que empiezan por el año y, a
continuación, los anuncios que empiezan por la marca.
Para corregir este problema, puede crear un procedimiento de ordenación en una clase que utilice la
ordenación alfabética estándar en la mayoría de los cuadros de lista, pero que pueda cambiar en tiempo de
ejecución al procedimiento de ordenación personalizado para anuncios de coches. Para ello, pasa el
procedimiento de ordenación personalizado a la clase de ordenación en tiempo de ejecución, utilizando
delegados.
Cada clase delegada define un constructor al cual se pasa la especificación de un método de objeto. Un
argumento para un constructor delegado debe ser una referencia a un método o una expresión lambda.
Para especificar una referencia a un método, utilice la sintaxis siguiente:
AddressOf [expression.]methodName
El tipo de tiempo de compilación de expression debe ser el nombre de una clase o interfaz que contenga un
método del nombre especificado cuya firma coincida con la firma de la clase delegada. methodName puede
Pág 101
Programación Orientada a Objetos en Visual Basic
ser un método compartido o un método de instancia. Aunque se cree un delegado para el método
predeterminado de la clase, methodName no es opcional.
Para especificar una expresión lambda, utilice la sintaxis siguiente:
Function ([parm como type, parm2 como type2, ...]) expression
La firma de la función debe coincidir con la del tipo de delegado. Para obtener más información sobre
expresiones lambda, vea Expresiones lambda.
Vea también
Tareas
Cómo: Pasar procedimientos a otro procedimiento en Visual Basic
Cómo: Invocar un método delegado
Cómo: Escribir controladores de eventos
Conceptos
Expresiones lambda
Eventos y controladores de eventos
AddHandler y RemoveHandler
Aplicaciones multiproceso
Referencia
Delegate (Instrucción)
AddressOf (Operador)
Copiar código
Delegate Sub MySubDelegate(ByVal x As Integer)
2. Declare una clase que contenga un método con la misma firma que el delegado.
Copiar código
Class class1
Sub Sub1(ByVal x As Integer)
MsgBox("The value of x is: " & CStr(x))
End Sub
End Class
3. Defina un método que cree una instancia del delegado e invoque el método asociado al delegado
llamando al método Invoke integrado.
Copiar código
Protected Sub DelegateTest()
Dim c1 As New class1
Pág 102
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Delegate Function MathOperator( _
ByVal x As Double, _
ByVal y As Double _
) As Double
2. Cree un procedimiento denominado AddNumbers con los parámetros y el valor devuelto que
coincidan con aquéllos de MathOperator para que coincidan las firmas.
Visual Basic
Copiar código
Function AddNumbers( _
Pág 103
Programación Orientada a Objetos en Visual Basic
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x + y
End Function
3. Cree un procedimiento denominado SubtractNumbers con una firma que coincida con
MathOperator.
Visual Basic
Copiar código
Function SubtractNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x - y
End Function
Visual Basic
Copiar código
Sub DelegateTest( _
ByVal x As Double, _
ByVal op As MathOperator, _
ByVal y As Double _
)
Dim ret As Double
ret = op.Invoke(x, y) ' Call the method.
MsgBox(ret)
End Sub
5. Cree un procedimiento denominado Test que llame a DelegateTest una vez con el delegado para
AddNumbers como parámetro y, de nuevo, con el delegado para SubtractNumbers como
parámetro.
Visual Basic
Copiar código
Pág 104
Programación Orientada a Objetos en Visual Basic
Cuando se llama a Test, muestra en primer lugar el resultado de AddNumbers al actuar sobre 5 y
3, que es 8. A continuación, se muestra el resultado de SubtractNumbers al actuar sobre 9 y 3,
que es 6.
Vea también
Tareas
Cómo: Invocar un método delegado
Referencia
AddressOf (Operador)
Delegate (Instrucción)
Otros recursos
Delegados de Visual Basic
Visual Basic
Copiar código
' Definition of delegate Del1.
Delegate Function Del1(ByVal arg As Integer) As Integer
Visual Basic
Copiar código
' Valid lambda expression assignments with Option Strict on or off:
Pág 105
Programación Orientada a Objetos en Visual Basic
Sólo se permiten las conversiones de restricción cuando Option Strict está establecido en Off.
Visual Basic
Copiar código
' Valid only when Option Strict is off:
Debe existir una conversión de ampliación en la dirección contraria desde el tipo de valor devuelto
de la función o Sub asignada al tipo de valor devuelto del delegado. En los ejemplos siguientes, el
cuerpo de cada expresión lambda asignada se debe evaluar como un tipo de datos que se amplía a
Integer, porque el tipo de valor devuelto de del1 es Integer.
Visual Basic
Copiar código
' Valid return types with Option Strict on:
Si Option Strict está establecido en Off, se quita la restricción de ampliación en ambas direcciones.
Visual Basic
Copiar código
Pág 106
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
' The assigned lambda expression specifies no parameters, even though
' Del2 has two parameters. Because the assigned function in this
' example is a lambda expression, Option Strict can be on or off.
' Compare the declaration of d16, where a standard function is assigned.
Dim d11 As Del2 = Function() 3
' The parameters are still there, however, as defined in the delegate.
Console.WriteLine(d11(5, "five"))
La capacidad de omitir parámetros es útil en una situación en la que se define un controlador de eventos,
donde están implicados varios parámetros complejos. No se usan argumentos en algunos controladores de
eventos. En su lugar, el controlador tiene directamente acceso al estado del control en el que se registra el
evento y omite los argumentos. Los delegados flexibles permiten omitir argumentos en aquellas
Pág 107
Programación Orientada a Objetos en Visual Basic
declaraciones sin ambigüedades. En el ejemplo siguiente, el método completo OnClick se puede volver a
escribir como RelaxedOnClick.
Visual Basic
Copiar código
Sub OnClick(ByVal sender As Object, ByVal e As EventArgs) Handles b.Click
MessageBox.Show("Hello World from" + b.Text)
End Sub
Visual Basic
Copiar código
' Definitions of f1, f2, f3, and f4.
Function f1(ByVal m As Integer) As Integer
End Function
Visual Basic
Copiar código
' Assignments to function delegate Del1.
Pág 108
Programación Orientada a Objetos en Visual Basic
El ejemplo siguiente sólo es válido cuando Option Strict está establecido en Off.
Visual Basic
Copiar código
' If Option Strict is Off, parameter specifications for f4 can be
omitted.
Dim d16 As Del1 = AddressOf f4
' Definition of function doubler, which both displays and returns the
' value of its integer parameter.
Function doubler(ByVal p As Integer) As Integer
Dim times2 = 2 * p
Console.WriteLine("Value of p: " & p)
Console.WriteLine("Double p: " & times2)
Return times2
End Function
Pág 109
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
' You can assign the function to the Sub delegate:
Dim d17 As Del3 = AddressOf doubler
' You can then call d17 like a regular Sub procedure.
d17(5)
Vea también
Tareas
Cómo: Pasar procedimientos a otro procedimiento en Visual Basic
Cómo: Escribir controladores de eventos
Conceptos
Expresiones lambda
Conversiones de ampliación y de restricción
Los delegados y el operador AddressOf
Inferencia de tipo de variable local
WithEvents y la cláusula Handles
Referencia
Option Strict (Instrucción)
Pág 110
Programación Orientada a Objetos en Visual Basic
Describe cómo indicar que una sección de código implementa una interfaz específica.
Ejemplos de implementación de interfaces en Visual Basic
Proporciona tres ejemplos de implementación de interfaces.
Cuándo se deben utilizar interfaces
Explica cuándo se deben utilizar interfaces en lugar de una jerarquía de herencia.
Cómo: Crear e implementar interfaces
Proporciona los pasos necesarios para definir e implementar una interfaz y aporta algunos
ejemplos.
Tutorial: Crear e implementar interfaces
Proporciona un procedimiento detallado que le conduce a través del proceso de definición e
implementación de su propia interfaz.
Secciones relacionadas
Herencia en Visual Basic
Explica la compatibilidad de Visual Basic con la herencia y permite definir clases que sirven de base
para clases derivadas.
Pág 111
Programación Orientada a Objetos en Visual Basic
Referencia
Instrucción Interface (Visual Basic)
Otros recursos
Herencia en Visual Basic
Definición de interfaz
Actualización: noviembre 2007
Las definiciones de interfaz se encuentran dentro de las instrucciones Interface y End Interface. Después
de la instrucción Interface, puede agregar una instrucción Inherits opcional que proporciona una lista de
una o varias interfaces heredadas. Las instrucciones Inherits deben ir antes que el resto de instrucciones de
una declaración, a excepción de los comentarios. El resto de instrucciones de una definición de interfaz
deberían ser instrucciones Event, Sub, Function, Property, Interface, Class, Structure y Enum. Las
interfaces no pueden contener código de implementación ni instrucciones asociadas a código de
implementación, como End Sub o End Property.
En un espacio de nombres, las instrucciones de interfaz son de manera predeterminada Friend, pero
también se pueden declarar explícitamente como Public o Friend. Las interfaces definidas dentro de las
clases, módulos, interfaces y estructuras son de manera predeterminada Public, pero también se pueden
declarar explícitamente como Public, Friend, Protected o Private.
Nota:
La palabra clave Shadows se puede aplicar a todos los miembros de la interfaz. La palabra clave
Overloads se puede aplicar a las instrucciones declaradas Sub, Function y Property en la
definición de una interfaz. Además, las instrucciones Property pueden tener los modificadores
Default, ReadOnly o WriteOnly. No se permite ninguno del resto de los modificadores: Public,
Private, Friend, Protected, Shared, Overrides, MustOverride o Overridable. Para obtener
más información, vea Contextos de declaración y niveles de acceso predeterminados.
Vea también
Tareas
Cómo: Crear e implementar interfaces
Tutorial: Crear e implementar interfaces
Conceptos
Información general sobre interfaces
Palabra clave Implements e instrucción Implements
Ejemplos de implementación de interfaces en Visual Basic
Cuándo se deben utilizar interfaces
Referencia
Instrucción Interface (Visual Basic)
Inherits (Instrucción)
Overloads
Default (Visual Basic)
Otros recursos
Herencia en Visual Basic
Pág 112
Programación Orientada a Objetos en Visual Basic
Los tipos de parámetro y de valores devueltos del miembro que realiza la implementación deben coincidir
con la propiedad de interfaz o la declaración de miembro de la interfaz. La forma más habitual de
implementar un elemento de una interfaz es con un miembro que tenga el mismo nombre que la interfaz,
como se muestra en el ejemplo anterior.
Para declarar la implementación de un método de interfaz, puede utilizar cualquier atributo permitido en las
declaraciones de método de instancia, incluidos Overloads, Overrides, Overridable, Public, Private,
Protected, Friend, Protected Friend, MustOverride, Default y Static. El atributo Shared no está
permitido, ya que define una clase en lugar de un método de instancia.
Con Implements también puede crear un único método que implemente varios métodos definidos en una
interfaz, como en el ejemplo siguiente:
Visual Basic
Copiar código
Class Class2
Implements I1, I2
Pág 113
Programación Orientada a Objetos en Visual Basic
Puede utilizar un miembro privado para implementar un miembro de interfaz. Cuando un miembro privado
implementa un miembro de una interfaz, el miembro pasa a estar disponible por medio de la interfaz,
aunque no está disponible directamente en las variables de objeto para la clase.
Vea también
Tareas
Cómo: Crear e implementar interfaces
Tutorial: Crear e implementar interfaces
Conceptos
Información general sobre interfaces
Definición de interfaz
Ejemplos de implementación de interfaces en Visual Basic
Cuándo se deben utilizar interfaces
Referencia
Implements (Instrucción)
Implements (Visual Basic)
Otros recursos
Herencia en Visual Basic
Guía de programación de Visual Basic
Pág 114
Programación Orientada a Objetos en Visual Basic
Implements Interface1
Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
' Insert code here to implement this method.
End Sub
End Class
Vea también
Tareas
Cómo: Crear e implementar interfaces
Tutorial: Crear e implementar interfaces
Conceptos
Información general sobre interfaces
Definición de interfaz
Palabra clave Implements e instrucción Implements
Cuándo se deben utilizar interfaces
Referencia
Instrucción Interface (Visual Basic)
Implements (Instrucción)
Pág 115
Programación Orientada a Objetos en Visual Basic
Pág 116
Programación Orientada a Objetos en Visual Basic
Visual Basic
Copiar código
Interface IAsset
End Interface
2. Agregue instrucciones que definan las propiedades, métodos y eventos que sean compatibles con la
interfaz. Por ejemplo, el siguiente código define una función, una propiedad y un evento.
Visual Basic
Copiar código
Interface IAsset
Event ComittedChange(ByVal Success As Boolean)
Property Division() As String
Function GetID() As Integer
End Interface
Visual Basic
Copiar código
Class Computer
Implements IAsset
End Class
3. Agregue procedimientos para implementar las propiedades, métodos y eventos de la clase como en
el código siguiente, que se basa en el ejemplo del paso anterior:
Visual Basic
Copiar código
Class Computer
Implements IAsset
Pág 117
Programación Orientada a Objetos en Visual Basic
Get
Return divisionValue
End Get
Set(ByVal value As String)
divisionValue = value
RaiseEvent ComittedChange(True)
End Set
End Property
Return IDValue
End Function
Vea también
Tareas
Tutorial: Crear e implementar interfaces
Conceptos
Información general sobre interfaces
Definición de interfaz
Palabra clave Implements e instrucción Implements
Ejemplos de implementación de interfaces en Visual Basic
Cuándo se deben utilizar interfaces
Referencia
Instrucción Interface (Visual Basic)
Otros recursos
Herencia en Visual Basic
Pág 118
Programación Orientada a Objetos en Visual Basic
Nota:
Los cuadros de diálogo y los comandos de menú que se ven pueden diferir de los descritos en la
Ayuda, dependiendo de los valores de configuración o de edición activos. Para cambiar la
configuración, seleccione Importar y exportar configuraciones en el menú Herramientas. Para
obtener más información, vea Valores de configuración de Visual Studio.
Visual Basic
Copiar código
Property Prop1() As Integer
Sub Method1(ByVal X As Integer)
Event Event1()
Implementación
Puede notar que la sintaxis utilizada para declarar los miembros de la interfaz es diferente de la sintaxis
utilizada para declarar los miembros de la clase. Esta diferencia refleja el hecho de que las interfaces no
pueden contener código de implementación.
Visual Basic
Copiar código
Pág 119
Programación Orientada a Objetos en Visual Basic
Class ImplementationClass
Si está trabajando dentro del entorno de desarrollo integrado, el Editor de código proporciona la
instrucción End Class correspondiente al presionar ENTRAR.
2. Agregue la siguiente instrucción Implements a ImplementationClass, que da nombre a la
interfaz que implementa la clase:
Visual Basic
Copiar código
Implements TestInterface
Visual Basic
Copiar código
Event Event1() Implements TestInterface.Event1
Visual Basic
Pág 120
Programación Orientada a Objetos en Visual Basic
Copiar código
' Holds the value of the property.
Private pval As Integer
Visual Basic
Copiar código
Return pval
Visual Basic
Copiar código
pval = value
Visual Basic
Copiar código
MsgBox("The X parameter for Method1 is " & X)
RaiseEvent Event1()
Visual Basic
Copiar código
Dim WithEvents testInstance As TestInterface
Al declarar testInstance como WithEvents, la clase Form1 puede controlar sus eventos.
3. Agregue el siguiente controlador de eventos a la clase Form1 para controlar los eventos
desencadenados por testInstance:
Visual Basic
Copiar código
Pág 121
Programación Orientada a Objetos en Visual Basic
4. Agregue una subrutina denominada Test a la clase Form1 para probar la clase de implementación:
Visual Basic
Copiar código
Sub Test()
' Create an instance of the class.
Dim T As New ImplementationClass
' Assign the class instance to the interface.
' Calls to the interface members are
' executed through the class instance.
testInstance = T
' Set a property.
testInstance.Prop1 = 9
' Read the property.
MsgBox("Prop1 was set to " & testInstance.Prop1)
' Test the method and raise an event.
testInstance.Method1(5)
End Sub
El procedimiento Test crea una instancia de la clase que implementa MyInterface, asigna esa
instancia al campo testInstance, define una propiedad y ejecuta un método a través de la
interfaz.
5. Agregue código para llamar al procedimiento Test desde el procedimiento Form1 Load del
formulario de inicio:
Visual Basic
Copiar código
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Test() ' Test the class.
End Sub
6. Ejecute el procedimiento Test presionando F5. Aparecerá el mensaje "Prop1 se ha definido como
9". Tras hacer clic en Aceptar, aparecerá el mensaje "El parámetro X de Method1 es 5". Al hacer clic
en Aceptar, aparecerá el mensaje "El controlador de eventos ha interceptado el evento".
Vea también
Pág 122
Programación Orientada a Objetos en Visual Basic
Tareas
Cómo: Crear e implementar interfaces
Conceptos
Cuándo se deben utilizar interfaces
Referencia
Implements (Instrucción)
Instrucción Interface (Visual Basic)
Event (Instrucción)
Otros recursos
Interfaces en Visual Basic
Pág 123
Programación Orientada a Objetos en Visual Basic
Fundamentos de la herencia
Actualización: noviembre 2007
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 solamente permite la
herencia simple en las clases; es decir, las clases derivadas solo 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 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 los métodos y propiedades de su clase base. Si una
propiedad o método heredados tienen que comportarse de manera diferente en la clase derivada, se pueden
invalidar. Es decir, se puede definir 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: evita que una propiedad o un método se invaliden en una clase que hereda. De
forma predeterminada, los métodos Public son NotOverridable.
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 está formada simplemente por la
instrucción Sub, Function o Property. No se permite ninguna otra instrucción y no hay
específicamente ninguna instrucción End Sub o End Function. Los métodos MustOverride se
deben declarar en las clases MustInherit.
Para obtener más información sobre los métodos de reemplazo, consulte Invalidar propiedades y métodos.
La palabra clave MyBase
Pág 124
Programación Orientada a Objetos en Visual Basic
Puede utilizar la palabra clave MyBase para llamar a métodos de una clase base cuando invalide 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:
Visual Basic
Copiar código
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping( _
ByVal Dist As Double, _
ByVal Rate As Double) _
As Double
' Call the method in the base class and modify the return value.
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class
Pág 125
Programación Orientada a Objetos en Visual Basic
Tareas
Cómo: Crear clases derivadas
Conceptos
Invalidar propiedades y métodos
Referencia
Inherits (Instrucción)
Otros recursos
Cambios en el lenguaje para usuarios de Visual Basic 6.0
Class Class2
Inherits Class1
Public Field2 As Integer
Overrides Sub Method2()
MsgBox("This is a method in a derived class.")
End Sub
End Class
Pág 126
Programación Orientada a Objetos en Visual Basic
Pág 127
Programación Orientada a Objetos en Visual Basic
mediante clases o interfaces no relacionadas. La siguiente ilustración muestra ejemplos de relaciones de tipo
"es un" y "tiene un".
Pág 128
Programación Orientada a Objetos en Visual Basic
Return NextCustomer
End Function
La aplicación también podría tener una lista similar de productos que el usuario ha agregado a una lista del
carro de la compra, como se muestra en el siguiente fragmento de código:
Visual Basic
Copiar código
Class ShoppingCartItem
Protected PreviousItem As ShoppingCartItem
Protected NextItem As ShoppingCartItem
Public ProductCode As Integer
Public Function GetNextItem() As ShoppingCartItem
' Insert code to get the next ShoppingCartItem from the list.
Return NextItem
End Function
End Class
Aquí puede ver un modelo: dos listas se comportan del mismo modo (inserciones, eliminaciones y
recuperaciones) pero funcionan con tipos de datos diferentes. Mantener dos bases de código para realizar
esencialmente las mismas funciones no es eficaz. La solución más eficaz consiste en separar la
administración de listas en su propia clase y después heredar de esa clase para diferentes tipos de datos:
Visual Basic
Copiar código
Class ListItem
Protected PreviousItem As ListItem
Protected NextItem As ListItem
Public Function GetNextItem() As ListItem
' Insert code to get the next item in the list.
Return NextItem
End Function
Public Sub InsertNextItem()
' Insert code to add a item to the list.
End Sub
Pág 129
Programación Orientada a Objetos en Visual Basic
End Sub
La clase ListItem sólo tiene que ser depurada una vez. Después podrá generar clases que la utilicen sin
tener que pensar nunca más sobre la administración de listas. Por ejemplo:
Visual Basic
Copiar código
Class CustomerInfo
Inherits ListItem
Public ID As Integer
Public FullName As String
End Class
Class ShoppingCartItem
Inherits ListItem
Public ProductCode As Integer
End Class
Aunque la reutilización de código basado en la herencia es una herramienta eficaz, también tiene riesgos
asociados. Incluso los sistemas mejor diseñados cambian a veces de tal modo que los diseñadores no
podrían prever. A veces, los cambios en una jerarquía de clases existente pueden tener consecuencias no
deseadas; en la sección Cambios en el diseño de la clase base después de la implementación de "El
problema de fragilidad de la clase base" se describen algunos ejemplos.
Clases derivadas intercambiables
Las clases derivadas de una jerarquía de clases pueden a veces intercambiarse con la clase base, un proceso
denominado polimorfismo basado en la herencia. Este enfoque combina las mejores características del
polimorfismo basado en la interfaz con la opción de reutilizar o reemplazar código de una clase base.
Así, esto podría ser útil en un paquete de dibujo. Por ejemplo, considere el siguiente fragmento de código,
que no utiliza herencia:
Visual Basic
Copiar código
Sub Draw(ByVal Shape As DrawingShape, ByVal X As Integer, _
ByVal Y As Integer, ByVal Size As Integer)
Pág 130
Programación Orientada a Objetos en Visual Basic
End Select
End Sub
Este enfoque presenta algunos problemas. Si alguien decide agregar una opción de elipse posteriormente,
será necesario modificar el código fuente; puede ocurrir que los usuarios a los que va dirigido ni siquiera
tengan acceso al código fuente. Un problema más sutil consiste en que para dibujar una elipse se necesita
otro parámetro (las elipses tienen un diámetro principal y uno secundario) que no sería relevante para el
caso de la línea. Si alguien desea agregar una polilínea (múltiples líneas conectadas), entonces se agregaría
otro parámetro que no sería relevante para otros casos.
La herencia resuelve la mayoría de estos problemas. Las clases base bien diseñadas dejan la implementación
de métodos específicos para las clases derivadas, de modo que se pueda incluir cualquier forma. Otros
programadores pueden implementar métodos en clases derivadas con la documentación de la clase base.
Otros elementos de clase (como las coordenadas x e y) se pueden integrar en la clase base porque todas las
descendientes los utilizan. Por ejemplo, Draw podría ser un método MustOverride:
Visual Basic
Copiar código
MustInherit Class Shape
Public X As Integer
Public Y As Integer
MustOverride Sub Draw()
End Class
Después podría agregar los elementos necesarios a esa clase para las diferentes formas. Por ejemplo, una
clase Line podría necesitar únicamente un campo Length:
Visual Basic
Copiar código
Class Line
Inherits Shape
Public Length As Integer
Overrides Sub Draw()
' Insert code here to implement Draw for this shape.
End Sub
End Class
Este planteamiento es útil debido a que otros programadores que no tienen acceso al código fuente pueden
extender la clase base con nuevas clases derivadas según sea necesario. Por ejemplo, una clase denominada
Rectangle podría derivarse de la clase Line:
Visual Basic
Copiar código
Class Rectangle
Inherits Line
Public Width As Integer
Overrides Sub Draw()
Pág 131
Programación Orientada a Objetos en Visual Basic
' Insert code here to implement Draw for the Rectangle shape.
End Sub
End Class
En este ejemplo se muestra cómo se puede pasar de clases de propósito general a clases muy específicas
mediante la implementación de detalles en cada nivel.
En este punto podría ser conveniente volver a evaluar si la clase derivada realmente representa una relación
de identidad o, por el contrario, es una relación de pertenencia. Si la nueva clase de rectángulo se compone
solamente de líneas, entonces la herencia no es la mejor opción. No obstante, si el nuevo rectángulo es una
línea con una propiedad de ancho, entonces se mantiene la relación de identidad.
Jerarquías de clases poco profundas
La herencia se adapta mejor a jerarquías de clases relativamente poco profundas. Las jerarquías de clases
complejas y profundas en exceso pueden ser difíciles de desarrollar. La decisión de utilizar una jerarquía de
clases implica sopesar sus ventajas y su complejidad. Como norma general, las jerarquías deberían limitarse
a seis niveles o menos. No obstante, la profundidad máxima de una jerarquía de clases concreta depende de
varios factores, incluida la complejidad de cada nivel.
Cambios globales en clases derivadas a través de la clase base
Una de las características más eficaces de la herencia es la posibilidad de realizar cambios en una clase base
que se propagan a las clases derivadas. Si se usa con cuidado, puede actualizarse la implementación de un
solo método y decenas, e incluso cientos, de clases derivadas podrán utilizar el nuevo código. No obstante,
esta práctica puede resultar peligrosa puesto que tales cambios podrían generar problemas en clases
heredadas diseñadas por otras personas. Debe tenerse cuidado para asegurarnos de que la nueva clase es
compatible con las clases que utilizan la original. Concretamente, debe evitarse cambiar el nombre o el tipo
de los miembros de la clase base.
Suponga, por ejemplo, que diseña una clase base con un campo de tipo Integer para almacenar la
información de código postal, y que otros programadores han creado clases derivadas que utilizan el campo
de código postal heredado. Suponga además que el campo de código postal almacena cinco dígitos y que la
oficina de correos ha ampliado los códigos postales con un guión y cuatro dígitos adicionales. En el peor de
los casos, podría modificar el campo en la clase base para almacenar una cadena de diez caracteres, pero
otros programadores tendrían que cambiar y volver a compilar las clases derivadas para utilizar el tamaño y
el tipo de datos nuevos.
La forma más segura de cambiar una clase base es simplemente agregar nuevos miembros. Por ejemplo,
podría agregar un nuevo campo para almacenar cuadro dígitos más en el ejemplo de código postal descrito
anteriormente. De esta forma, las aplicaciones cliente pueden actualizarse para que utilicen el nuevo campo
sin interrumpir las aplicaciones existentes. Esta posibilidad de extender clases base en una jerarquía de
herencia es una ventaja importante que no existe con interfaces.
Vea también
Conceptos
Cuándo se deben utilizar interfaces
Cambios en el diseño de la clase base después de la implementación
Pág 132
Programación Orientada a Objetos en Visual Basic
Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos
de la interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edición de
Visual Studio que se tenga y la configuración que se utilice determinan estos elementos. Para
obtener más información, vea Valores de configuración de Visual Studio.
Pág 133
Programación Orientada a Objetos en Visual Basic
4. En el Explorador de proyectos, haga clic con el botón secundario del mouse en Class1 y, a
continuación, haga clic en Propiedades. Aparecerá la ventana Propiedades correspondiente a la
clase.
5. Establezca la propiedad Name en MathFunctions.
6. En el Explorador de proyectos, haga clic con el botón secundario del mouse en MathFunctions y, a
continuación, haga clic en Ver código. Aparece el Editor de código.
7. Agregue una variable local, que contendrá el valor de la propiedad:
Copiar código
' Local variable to hold property value
Private mvarProp1 As Integer
8. Agregue los procedimientos de propiedad Let y Get:
Copiar código
Public Property Let Prop1(ByVal vData As Integer)
'Used when assigning a value to the property.
mvarProp1 = vData
End Property
Public Property Get Prop1() As Integer
'Used when retrieving a property's value.
Prop1 = mvarProp1
End Property
9. Agregue una función:
Copiar código
Function AddNumbers( _
ByVal SomeNumber As Integer, _
ByVal AnotherNumber As Integer) _
As Integer
Nota:
Aunque es posible exponer una clase creada con Visual Basic como un objeto COM, en realidad, no
se trata de un verdadero objeto COM y no se puede utilizar en este tutorial. Para obtener
información detallada, vea Interoperabilidad COM en aplicaciones .NET Framework.
Ensamblados de interoperabilidad
En el procedimiento siguiente va a crear un ensamblado de interoperabilidad que servirá como puente entre
el código no administrado (como un objeto COM) y el código administrado que utiliza Visual Studio. El
ensamblado de interoperabilidad creado por Visual Basic controla muchos de los aspectos del trabajo con
objetos COM, como el cálculo de referencias de interoperabilidad, el proceso de empaquetado de parámetros
y valores devueltos en los tipos de datos equivalentes enviados a objetos COM (o recibidos de objetos COM).
Pág 134
Programación Orientada a Objetos en Visual Basic
Para utilizar un objeto COM con Visual Basic 2005 y versiones posteriores
1. Abra un nuevo proyecto de aplicación para Windows de Visual Basic.
2. En el menú Proyecto, haga clic en Agregar referencia.
Aparece el cuadro de diálogo Agregar referencia.
3. En la ficha COM, haga doble clic en ComObject1 en la lista Nombre de componente y, a
continuación, haga clic en Aceptar.
4. En el menú Proyecto, haga clic en Agregar nuevo elemento.
Se abrirá el cuadro de diálogo Agregar nuevo elemento.
5. En el panel Plantillas, haga clic en Clase.
En el campo Nombre aparecerá el nombre de archivo predeterminado, Class1.vb. Cambie este
campo a MathClass.vb y haga clic en Agregar. Esto creará una clase denominada MathClass y
mostrará su código.
6. Agregue el código siguiente al principio de MathClass para heredar de la clase COM.
Visual Basic
Copiar código
' The inherited class is called MathFunctions in the base class,
' but the interop assembly appends the word Class to the name.
Inherits ComObject1.MathFunctionsClass
Visual Basic
Copiar código
' This method overloads the method AddNumbers from the base class.
Overloads Function AddNumbers( _
ByVal SomeNumber As Integer, _
ByVal AnotherNumber As Integer) _
As Integer
Visual Basic
Copiar código
' The following function extends the inherited class.
Pág 135
Programación Orientada a Objetos en Visual Basic
Function SubtractNumbers( _
ByVal SomeNumber As Integer, _
ByVal AnotherNumber As Integer) _
As Integer
La nueva clase hereda las propiedades de la clase base del objeto COM, sobrecarga un método y define otro
método para extender la clase.
Visual Basic
Copiar código
Dim Result1 As Short
Dim Result2 As Integer
Dim Result3 As Integer
Dim MathObject As New MathClass
Result1 = MathObject.AddNumbers(4S, 2S) ' Add two Shorts.
Result2 = MathObject.AddNumbers(4, 2) 'Add two Integers.
Result3 = MathObject.SubtractNumbers(2, 4) ' Subtract 2 from 4.
MathObject.Prop1 = 6 ' Set an inherited property.
Pág 136
Programación Orientada a Objetos en Visual Basic
Pasos siguientes
Es posible que haya observado que la función AddNumbers sobrecargada parece tener el mismo tipo de
datos que el método heredado de la clase base del objeto COM. Esto se debe a que los argumentos y
parámetros del método de la clase base están definidos como enteros de 16 bits en Visual Basic 6.0, pero se
exponen como enteros de 16 bits de tipo Short en las versiones posteriores de Visual Basic. La nueva
función acepta enteros de 32 bits y sobrecarga la función de la clase base.
Al trabajar con objetos COM, es importante comprobar el tamaño y los tipos de datos de los parámetros. Por
ejemplo, al utilizar un objeto COM que acepta un objeto de colección de Visual Basic 6.0 como argumento,
no puede proporcionar una colección de una versión posterior de Visual Basic. Para obtener más información
sobre los controles de tipo de datos, vea Cambios en el lenguaje para usuarios de Visual Basic 6.0.
Es posible reemplazar propiedades y métodos heredados de clases COM, lo que significa que se puede
declarar una propiedad o método local que reemplace una propiedad o método heredado de una clase base
COM. Las reglas para reemplazar propiedades COM heredadas son similares a las reglas para reemplazar
otras propiedades y métodos, con las excepciones siguientes:
Si reemplaza cualquier propiedad o método heredado de una clase COM, deberá reemplazar todas
las demás propiedades y métodos heredados.
No es posible reemplazar las propiedades que utilizan parámetros ByRef.
Vea también
Tareas
Cómo: Crear clases derivadas
Conceptos
Invalidar propiedades y métodos
Referencia
Inherits (Instrucción)
Short (Tipo de datos, Visual Basic)
Otros recursos
Interoperabilidad COM en aplicaciones .NET Framework
Cambios en el lenguaje para usuarios de Visual Basic 6.0
Pág 137
Programación Orientada a Objetos en Visual Basic
GetType
Cuando un objeto deja de ser necesario, CLR llama al método Finalize para ese objeto antes de liberar su
memoria. El método Finalize se denomina destructor porque realiza tareas de limpieza, como guardar
información de estado, cerrar archivos y conexiones a bases de datos, y otras tareas que deben realizarse
antes de liberar el objeto.
Pág 138
Programación Orientada a Objetos en Visual Basic
Vea también
Conceptos
Duración de los objetos: cómo se crean y destruyen
Polimorfismo
Actualización: noviembre 2007
El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con
métodos o propiedades denominados de forma idéntica, que pueden utilizarse de manera intercambiable
mediante código cliente en tiempo de ejecución.
En esta sección
Cómo proporciona Visual Basic polimorfismo
Se ilustran distintos enfoques del polimorfismo.
Polimorfismo basado en la herencia
Se describe el uso de la herencia para conseguir el polimorfismo.
Polimorfismo basado en la interfaz
Se describe el uso de las interfaces para conseguir el polimorfismo.
Secciones relacionadas
Cuándo se deben utilizar interfaces
Explica cuándo se deben utilizar interfaces en lugar de una jerarquía de herencia.
Cuándo utilizar la herencia
Proporciona información sobre cuándo se debe utilizar la herencia en lugar de interfaces.
Pág 139
Programación Orientada a Objetos en Visual Basic
Pág 140
Programación Orientada a Objetos en Visual Basic
Inherits BaseTax
Private BaseAmount As Double
Overrides Function CalculateTax(ByVal Amount As Double) As Double
' Some cities apply a tax to the total cost of purchases,
' including other taxes.
BaseAmount = MyBase.CalculateTax(Amount)
Return CityRate * (BaseAmount + Amount) + BaseAmount
End Function
End Class
Sub TestPoly()
Dim Item1 As New BaseTax
Dim Item2 As New CityTax
' $22.74 normal purchase.
ShowTax(Item1, 22.74)
' $22.74 city purchase.
ShowTax(Item2, 22.74)
End Sub
En este ejemplo, el procedimiento ShowTax acepta un parámetro denominado Item de tipo BaseTax, pero
también puede pasar cualquiera de las clases derivadas de la clase BaseTax, como CityTax. La ventaja de
este diseño es que se pueden agregar nuevas clases derivadas de la clase BaseTax sin cambiar el código
cliente en el procedimiento ShowTax.
Vea también
Conceptos
Polimorfismo basado en la interfaz
Otros recursos
Diseñar una jerarquía de herencia
Pág 141
Programación Orientada a Objetos en Visual Basic
implementación. Las interfaces múltiples tienen la ventaja de permitir la evolución de los sistemas de
componentes de software sin interrumpir el código existente.
Para conseguir el polimorfismo con interfaces, se implementa una interfaz de diferentes formas en varias
clases distintas. Las aplicaciones cliente pueden utilizar la implementación nueva o la antigua, exactamente
de la misma manera. La ventaja del polimorfismo basado en interfaz es que no es necesario volver a
compilar aplicaciones cliente existentes para que funcionen con nuevas implementaciones de interfaz.
El siguiente ejemplo define una interfaz denominada Shape2 que se implementa en una clase denominada
RightTriangleClass2 y RectangleClass2. Un método denominado ProcessShape2 llama al método de
instancias CalculateArea de RightTriangleClass2 o RectangleClass2:
Visual Basic
Copiar código
Sub TestInterface()
Dim RectangleObject2 As New RectangleClass2
Dim RightTriangleObject2 As New RightTriangleClass2
ProcessShape2(RightTriangleObject2, 3, 14)
ProcessShape2(RectangleObject2, 3, 5)
End Sub
Pág 142
Programación Orientada a Objetos en Visual Basic
Vea también
Tareas
Cómo: Crear e implementar interfaces
Conceptos
Polimorfismo basado en la herencia
Pág 143
Programación Orientada a Objetos en Visual Basic
Por ejemplo, suponga que está diseñando un jerarquía de clases que modela el hardware del
equipo. Al comenzar a modelar los dispositivos de salida, podría definir clases denominadas
Display, Printer y File. Después podría definir las clases que implementan los métodos
definidos en las clases base. Por ejemplo, la clase LCDDisplay puede haber derivado de Display e
implementar un método denominado EnterPowerSaveMode.
Defina los tipos de datos y el almacenamiento con generosidad a fin de evitar cambios difíciles
posteriormente. Por ejemplo, podría considerar el uso de una variable de tipo Long aunque los
datos actuales sólo requieran una variable estándar Integer.
Exponga sólo los elementos que las clases derivadas necesiten. Los campos y métodos Private
reducen los conflictos de denominación y protegen a otros usuarios del uso de elementos que
pueden necesitar cambios posteriormente.
Los miembros que sólo sean necesarios para las clases derivadas deben marcarse como Protected.
Esto garantiza que sólo las clases derivadas dependen de estos miembros y facilita la actualización
de estos miembros durante el desarrollo.
Asegúrese de que los métodos de clase base no dependen de miembros Overridable cuya
funcionalidad pueden cambiar las clases herederas.
Vea también
Conceptos
Consideraciones sobre la elección de niveles de acceso para métodos
Cambios en el diseño de la clase base después de la implementación
Referencia
MustInherit
MustOverride
Pág 144
Programación Orientada a Objetos en Visual Basic
Pág 145
Programación Orientada a Objetos en Visual Basic
Nota:
No conviene escribir código desde el que se pueda tener acceso a un miembro compartido a través
de una instancia de la clase. Esto se debe a que el compilador no tiene en cuenta la calificación del
miembro compartido y lo trata como si se obtuviera acceso a él directamente a través de la clase.
En algunas situaciones, quizás desee que el objeto de cualificación ejecute cierto código y, por
tanto, el compilador de Visual Basic genere una advertencia de acceso a un miembro compartido a
través de una instancia de una clase. IntelliSense no muestra los miembros compartidos de una
instancia de la clase.
Pág 146
Programación Orientada a Objetos en Visual Basic
End Sub
Sub TestShared()
' Create two instances of the class.
Dim part1 As New Item("keyboard")
Dim part2 As New Item("monitor")
part1.InstanceMethod()
part2.InstanceMethod()
Item.ShareMethod()
End Sub
Cuando ejecuta el procedimiento TestShared, se crean dos instancias de la clase. El constructor utiliza el
campo compartido Count para inicializar el campo de instancia SerialNumber y, a continuación, incrementa
Count. Esta técnica proporciona automáticamente a cada instancia un número de serie diferente.
Después de crear las dos instancias, el método de instancia InstanceMethod se llama en ambos objetos, y
también se llama al método compartido ShareMethod. El resultado es:
Information in the first object: 1 keyboard
Information in the second object: 2 monitor
Current value of the shared Count field: 3
Vea también
Conceptos
Estructuras y clases
Referencia
Instrucción Dim (Visual Basic)
Cos
Otros recursos
Propiedades, campos y métodos de clases
Pág 147
Programación Orientada a Objetos en Visual Basic
Pág 148
Programación Orientada a Objetos en Visual Basic
Nota:
El enlace en tiempo de ejecución sólo puede utilizarse para obtener acceso a miembros de tipo
declarados como Public. Tener acceso a miembros declarados como Friend o Protected Friend
produce un error en tiempo de ejecución.
Vea también
Conceptos
Duración de los objetos: cómo se crean y destruyen
Referencia
Object (Tipo de datos)
CreateObject (Función, Visual Basic)
Pág 149
Programación Orientada a Objetos en Visual Basic
El operador TypeOf...Is es idóneo para comprobar el tipo de un objeto, puesto que es mucho más rápido
que una comparación de cadenas equivalente que utiliza TypeName. El fragmento de código siguiente usa
TypeOf...Is dentro de una instrucción If...Then...Else:
Visual Basic
Copiar código
If TypeOf Ctrl Is Button Then
MsgBox("The control is a button.")
End If
Use este método con precaución. El operador TypeOf...Is devuelve True si un objeto es de un tipo
específico o si se deriva de un tipo específico. Casi todas las tareas que se pueden realizar con Visual Basic
implican el uso de objetos, entre ellos algunos elementos que normalmente no se suponen objetos, por
ejemplo, cadenas y enteros. Estos objetos se derivan de Object y heredan métodos de ellos. Cuando se pasa
un Integer y se evalúa con Object, el operador TypeOf...Is devuelve True. El resultado del ejemplo
siguiente declara que el parámetro InParam es a la vez Object e Integer:
Visual Basic
Copiar código
Sub CheckType(ByVal InParam As Object)
' Both If statements evaluate to True when an
' Integer is passed to this procedure.
If TypeOf InParam Is Object Then
MsgBox("InParam is an Object")
End If
If TypeOf InParam Is Integer Then
MsgBox("InParam is an Integer")
End If
End Sub
Pág 150
Programación Orientada a Objetos en Visual Basic
En el ejemplo siguiente se utilizan TypeOf...Is y TypeName para determinar el tipo del objeto que se les
pasa en el argumento Ctrl. El procedimiento TestObject llama a ShowType con tres clases de controles
diferentes.
Visual Basic
Copiar código
Sub ShowType(ByVal Ctrl As Object)
'Use the TypeName function to display the class name as text.
MsgBox(TypeName(Ctrl))
'Use the TypeOf function to determine the object's type.
If TypeOf Ctrl Is Button Then
MsgBox("The control is a button.")
ElseIf TypeOf Ctrl Is CheckBox Then
MsgBox("The control is a check box.")
Else
MsgBox("The object is some other type of control.")
End If
End Sub
Vea también
Conceptos
Llamar a una propiedad o método mediante un nombre de cadena
Referencia
Object (Tipo de datos)
TypeName (Función, Visual Basic)
Instrucción If...Then...Else (Visual Basic)
String (Tipo de datos, Visual Basic)
Integer (Tipo de datos, Visual Basic)
Otros recursos
Obtener información de clases en tiempo de ejecución
Pág 151
Programación Orientada a Objetos en Visual Basic
Pág 152
Programación Orientada a Objetos en Visual Basic
La aplicación podría utilizar controles de cuadro de texto para controlar qué método se va a llamar y sus
argumentos. Por ejemplo, si TextBox1 contiene la expresión que se va a evaluar y TextBox2 se utiliza para
escribir el nombre de la función, puede utilizar el siguiente código para invocar la función SquareRoot en la
expresión de TextBox1:
Visual Basic
Copiar código
Private Sub CallMath()
Dim Math As New MathClass
Me.TextBox1.Text = CStr(CallByName(Math, Me.TextBox2.Text, _
Microsoft.VisualBasic.CallType.Method, TextBox1.Text))
End Sub
Nota:
Mientras que la función CallByName puede ser útil en algunas situaciones, debe sopesar su
utilidad frente a las implicaciones de rendimiento; el uso de CallByName para invocar un
procedimiento es un poco más lento que una llamada enlazada en tiempo de ejecución. Si está
invocando una función a la que se llama repetidamente, como ocurriría dentro de un bucle,
CallByName puede afectar de forma grave al rendimiento.
Vea también
Tareas
Cómo: Realizar varias acciones en un objeto
Conceptos
Determinar el tipo de objeto
Referencia
CallByName (Función)
Otros recursos
Obtener información de clases en tiempo de ejecución
Pág 153