Unidad 18. Ciclo de vida de una clase en VB (II)





18.4. Proteger nuestra clase.

Se trata de bloquear el constructor sin argumentos convirtiéndolo en private.

 

En muchas ocasiones es imprescindible, sobre todo cuando deseamos exigir datos en la inicialización de la misma, y no deseamos que se inicie una copia de nuestra clase de forma accidental.

 

Public Class Clase

  Public UnDato As Integer

  ' Constructor sin captura de datos

  Private Sub New()

 

  End Sub

 

  ' Constructor que obliga a introducir un dato en la inicialización

  Public Sub New(ByVal AlgunDato As Integer)

    UnDato = AlgunDato

  End Sub

End Class

 

De esa forma no es visible y no se puede utilizar, y es imposible que se use accidentalmente.

 

Normalmente es muy habitual que necesitemos varios escenarios posibles en el inicio de un objeto, por lo que la solicitud de datos en el constructor se puede volver algo complicada.

 

En las clases existe el concepto de sobrecarga, esto significa poder escribir varias versiones de un mismo método, - más adelante se expondrá el tema - , ese es el camino más adecuado para poder solventar el problema de los distintos escenarios posibles en el inicio de una clase para los objetos que se derivan de ella.

 

En el siguiente ejemplo, podemos observar como se han escrito varias versiones del constructor en el cual se ha declarado distintas versiones de la misma variable, String, Integer, aunque no tiene porque cambiar el nombre de la variable.

 

Public Class Clase

  Public UnDato As Integer

  ' Constructor sin captura de datos

  Private Sub New()

 

  End Sub

 

  ' Constructor que obliga a introducir un dato en la inicialización

  Public Sub New(ByVal AlgunDato As Integer)

    UnDato = AlgunDato

  End Sub

 

  ' Constructor que obliga a introducir un dato en la inicialización

  Public Sub New(ByVal AlgunDato As String)

 

  End Sub

 

End Class

 

Pero también se puede crear con distintas variables en cada uno de ellos.

 

Public Class Clase

  Public UnDato As Integer

  ' Constructor sin captura de datos

  Private Sub New()

 

  End Sub

 

  ' Constructor que obliga a introducir un dato en la inicialización

  Public Sub New(ByVal AlgunDato As Integer)

    UnDato = AlgunDato

  End Sub

 

  ' Constructor que obliga a introducir un dato en la inicialización

  Public Sub New(ByVal AlgunDato As Integer, ByVal OtroDato as Integer)

 

  End Sub

End Class

 

Podemos observar como en este ejemplo se mantiene el nombre de la variable, pero se añade una nueva en la segunda versión del mismo.

18.5. Ejecución de la clase.

La clase no se ejecuta, se ejecuta una instancia de la misma, en el objeto que de ella se crea.

El punto de inicio es el constructor de la misma.

 

  ' Constructor que obliga a introducir un dato en la inicialización

  Public Sub New(ByVal AlgunDato As Integer)

 

  End Sub

 

La ejecución del objeto, se iniciará en una fase inicial cuando se declara y se inicializa el mismo, y en segundas fases cuando se reclama la ejecución de cualquiera de sus métodos.

La finalización de la ejecución de cualquiera de sus métodos no implica que deje de ser utilizado el objeto y que éste deje de consumir recursos.

La ejecución permanecerá activa hasta que se ejecute una asignación de “nothing” o “null”, al objeto que de ella se deriva, o bien hasta que desaparezca el mismo de la memoria por finalizar el procedimiento o programa que lo reclama, o bien finalicemos la misma con el método de finalización previsto en el lenguaje.

Tengamos presente que mientras no se ejecute una de estas acciones, el objeto estará consumiendo recursos del sistema.

18.6. Finalización de la clase.

Finalize está protegido y, por lo tanto, sólo se puede obtener acceso a él a través de esta clase o de una clase derivada.

Este método se invoca de forma automática, después de que un objeto pase a ser inaccesible, salvo que haya sido excluido del proceso de finalización mediante una llamada a SuppressFinalize. Durante el cierre de un dominio de aplicación, se realiza una llamada automática a Finalize para los objetos que no están exentos de finalización, incluso para aquellos objetos que a los que aún se puede obtener acceso. Sólo se realiza una llamada a Finalize para una instancia especificada, a menos que el objeto vuelva a registrarse mediante un mecanismo como ReRegisterForFinalize   y no se haya llamado posteriormente a GC.SuppressFinalize.

Todas las implementaciones de Finalize en un tipo derivado deben llamar a la correspondiente implementación de tipo base de Finalize. Este es el único caso en el que se permite al código de la aplicación llamar a Finalize.

 

La regla de oro a seguir es que no se debe poner ningún código que deba ser ejecutado en el método finalize().

Por ejemplo, si se necesita concluir la comunicación con un servidor cuando ya no se va a usar un objeto, no debe ponerse el código de desconexión en el método finalize, porque puede que nunca sea llamado.

Es responsabilidad del programador escribir métodos para realizar la limpieza que no involucre a la memoria ocupada por el objeto y ejecutarlos en el instante preciso.

 

 Objeto = nothing

 

El método finalize y el recolector de memoria son útiles para liberar la memoria de la pila y debería restringirse su uso solamente a eso, y no depender de ellos para realizar ningún otro tipo de limpieza.

 

En la construcción de un objeto, se desplaza uno por el árbol de jerarquía, de herencia, desde la raíz del árbol hacia las ramas, y en la finalización, es al revés, los desplazamientos por la herencia debe ser desde las ramas hacia las superclases hasta llegar a la clase raíz.

 

•Ejercicios propuestos de la Unidad
Octubre-2010
Pág. 18.2

Atrás  Inicio  Adelante






Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies