1 1. Introduccion Miembros de la clase Los elementos de una clase que contienen sus datos y definen su comportamiento, es decir, las propiedades y métodos, reciben además el nombre de miembros de la clase, término que también utilizaremos a partir de ahora. Definir la información de la clase Existen dos formas de almacenar los datos o información en una clase: a través de campos de clase y de propiedades. El uso de campos o propiedades para una clase es una cuestión de diseño, no pudiendo afirmar categóricamente que un tipo de almacenamiento de datos sea mejor que otro. 2 Campos Public Class BankAccount Private Adding abalance data member named As Double balance End Class Keyword Definition Public Totalmente accesible Private Accesible soló dentro de el mismo 3 Propiedades Una propiedad en la clase se define, por norma general, mediante dos elementos: una variable de propiedad y un procedimiento de propiedad. La variable de propiedad, tal y como su nombre indica, es una variable con ámbito privado a nivel de la clase, que se encarga de guardar el valor de la propiedad. Por su parte el procedimiento de propiedad o Property, es el encargado de actuar de puente entre el código cliente y la variable de propiedad, realizando las operaciones de acceso y asignación de valores a dicha variable. 4 Propiedades Private customerName As String Public Property Name( ) As String Get Return customerName End Get Set(ByVal Value As String) customerName = Value End Set End Property 5 Propiedades Pueden crearse propiedades de solo lectura o escritura Public ReadOnly Property Public WriteOnly Property 6 Propiedades Propiedades virtuales Otra de las ventajas del uso de propiedades reside en la posibilidad de definir propiedades virtuales; es decir, una propiedad que no tenga una correspondencia directa con una variable de propiedad, ya que podemos crear un procedimiento Property que no esté obligatoriamente asociado con una variable. 7 Propiedades Propiedades predeterminadas Una propiedad predeterminada o por defecto, es aquella que nos permite su manipulación omitiendo el nombre. Para establecer una propiedad como predeterminada en una clase, la variable de propiedad asociada deberá ser un array, pudiendo crear sólo una propiedad predeterminada por clase. Al declarar una propiedad por defecto, deberemos utilizar al comienzo de la sentencia de declaración, la palabra clave Default. Para asignar y obtener valores de este tipo de propiedad, tendremos que utilizar el índice del array que internamente gestiona la propiedad. 8 Métodos Para crear un método en una clase debemos escribir un procedimiento de tipo Sub o Function, en función de si necesitamos devolver o no, un valor desde el método. 9 Métodos La sobrecarga de métodos, es una técnica que consiste en crear varios métodos con idéntico nombre dentro de la misma clase, distinguiéndose entre sí por su lista de parámetros. Para declarar un método como sobrecargado, debemos utilizar la palabra clave Overloads después del modificador de ámbito. Podemos sobrecargar métodos de tipo Sub y Function. 10 Constructores Introduccion El primer método que es ejecutado al instanciar un objeto de la clase se denomina constructor. Este tipo de método resulta útil para tareas de configuración iniciales sobre el objeto. No es necesario escribir un método constructor en la clase, ya que en el caso de que no exista, el compilador se encarga de crearlo implícitamente. 11 Constructores Introduccion Admite parámetros Puede sobrecargarse 12 Herencia Introduccion VB.NET es la primera versión de este lenguaje que incorpora herencia, una característica demandada por un amplio colectivo de los programadores de esta herramienta; y es que, a pesar de haber sido incorporados progresivamente aspectos de orientación a objetos al lenguaje, este era el elemento fundamental que faltaba para ser plenamente OOP. 13 Herencia Introduccion Para crear una clase derivada, debemos declarar una nueva clase, especificando cuál es su clase base mediante la palabra clave Inherits. 14 Herencia Reglas de ambito Public: dicho elemento será accesible por todo el código de la clase, clases heredadas y código cliente; Private, ese miembro sólo será accesible por el código de la propia clase. Protected Un miembro de clase declarado con este modificador, será accesible desde el código de su propia clase y desde cualquier clase heredada. Friend Un miembro de clase declarado con este modificador, será accesible por todo el código de su proyecto o ensamblado. 15 Herencia Sobrecarga de métodos Podemos sobrecargar métodos existentes en una clase base dentro de una clase derivada, para ello simplemente escribimos la implementación del método sobrecargado utilizando la palabra clave Overloads, 16 Herencia Sobrecarga de métodos Acceso a los métodos de la clase base:MyBase: proporciona acceso a los miembros de una clase base desde su correspondiente subclase. 17 Herencia Sobre-escritura de métodos Esta técnica consiste en la capacidad de crear, en una clase derivada, un método que altere parcial o totalmente, la implementación ya existente de dicho método en la clase base. Una de las diferencias existentes con la sobrecarga de métodos, estriba en que al sobrescribir, el método en la subclase puede tener el mismo nombre y lista de parámetros que el ya existente en la clase padre. Podemos sobrescribir tanto métodos como propiedades. 18 Herencia Sobre-escritura de métodos Para indicar en la clase base que un método podrá ser sobrescrito en una subclase, debemos declarar dicho método utilizando la palabra clave Overridable. Posteriormente, cuando en una clase derivada queramos rescribir el método de la clase base, lo declararemos empleando la palabra clave Overrides. Podemos deducir por lo tanto, que la reescritura de métodos es un proceso que se debe realizar con el consentimiento previo de la clase base. Se puede utilizar cualquier método de la clase padre usando la palabra clave MyBase 19 Herencia Ocultamiento de miembros de una clase Esta técnica consiste en crear dentro de una clase derivada, miembros con el mismo nombre (y firma,en el caso de métodos) que los existentes en la clase base, pero ocultando el acceso a los miembros de la clase base para los objetos instanciados de la subclase. Utilizaremos la palabra clave Shadows, en la declaración de aquellos miembros a esconder. 20 Herencia Constructores. Podemos crear una clase base que implemente un constructor y una subclase sin él. En esta situación,cuando instanciemos un objeto de la subclase, se llamará implícitamente al constructor de la clase base para ejecutar el código de inicialización. También es posible crear el constructor sólo en la clase derivada. Si ambas clases disponen de un constructor, en primer lugar se ejecutará el constructor de la clase base y después el de la clase derivada. Realmente, el primer constructor ejecutado corresponde a la clase Object, y sucesivamente, se irán ejecutando todos los constructores de la jerarquía de clases hasta llegar a la clase que originó la llamada. 21 Herencia Constructores. El problema sobreviene cuando en la clase base creamos un constructor parametrizado, ya que ello obliga a sus clases derivadas a crear también un método constructor dentro del cuál se haga una llamada al constructor de la clase base. 22 Herencia Clases selladas: si no queremos que nuestra clase pueda ser heredada por otras, debemos declararla de forma que no permita herencia; a este tipo de clase se le denomina clase no heredable o sellada (sealed). Para definir una clase no heredable, debemos utilizar la palabra clave NotInheritable 23 Herencia Clases abstractas o no instanciables Una clase abstracta es aquella que no permite la instanciación directa de objetos a partir de ella, siendo necesario una clase derivada para acceder a sus miembros. Aunque en una clase abstracta podemos escribir un método constructor, sólo será accesible desde el constructor de la subclase. Para definir una clase abstracta utilizaremos la palabra clave MustInherit en el momento de su declaración, 24 Comprobación del tipo de un objeto y moldeado Usando Objetos Genericos(Object) GetType( ) nos permite saber el tipo de objeto que es. Devuelve un objeto de la clase Type. CType( ), que realiza un moldeado de la variable que contiene el objeto hacia un tipo determinado, y nos permite acceder a los elementos del objeto. 25 Miembros compartidos (shared) de una clase Podemos pues clasificar los miembros de una clase en dos categorías: Miembros de instancia (instance members). Son aquellos a los que accedemos a través de un objeto instanciado previamente de la clase. Miembros compartidos (shared members). Son aquellos a los que podemos acceder sin necesidad de que exista un objeto creado de la clase. 26 Miembros compartidos (shared) de una clase Podemos declarar como compartidos los métodos, propiedades y campos de una clase. Para ello deberemos emplear la palabra clave Shared en la declaración. Para utilizar desde el código cliente un miembro compartido, tan sólo debemos poner el nombre de la clase a la que pertenece, el punto y el nombre del miembro a utilizar. 27 Destrucción de objetos y recolección de basura En VB6 La destrucción de objetos y liberación de recursos en está basada en una técnica que mantiene un contador interno de las referencias que en el código cliente hay establecidas hacia un objeto; cuando la última referencia es eliminada, se ejecuta su evento Terminate( ) Este sistema de destrucción se denomina finalización determinista, ya que nos permite saber el momento preciso en el que un objeto es destruido. 28 Destrucción de objetos y recolección de basura En Net no utiliza conteo de referencias, sino que en su lugar, implementa un sistema de búsqueda y eliminación de objetos que ya no están siendo utilizados, denominado recolección de basura (garbage collection). 29 Destrucción de objetos y recolección de basura En Net Como ya hemos mencionado, el recolector de basura funciona de modo automático; no obstante, si en un determinado momento queremos forzar su uso, la jerarquía de .NET nos provee de la clase GC (Garbage Collector), que representa al objeto recolector, pudiendo manipularlo a través de sus miembros compartidos. Por ejemplo, si necesitamos que se efectúe la recolección de objetos que no estén siendo utilizados ejecutaríamos el método Collect( ) de este objeto 30 Destrucción de objetos y recolección de basura En Net En .NET Framework los objetos disponen de métodos finalizadores. Para implementar este tipo de miembro en nuestras clases, escribiremos un método con el nombre Finalize( ), de ámbito Protected, que sobrescriba y llame al finalizador de su clase padre. Cuando asignamos Nothing a un objeto, o la variable que lo contiene pierde su ámbito y es eliminada, transcurre un tiempo que no es posible determinar hasta que el objeto es definitivamente destruido. 31 Interfaces Concepto: análogo al de contrato, las partes integrantes son el propio interfaz y la clase que lo implementa. Mientras que el interfaz no puede ser cambiado desde el momento en que sea implementado, la clase que lo implementa se compromete a crear la lista de miembros en la misma forma que indica el interfaz Un interfaz proporciona, a modo de declaración, una lista de propiedades y métodos, que posteriormente serán codificados en una o varias clases. Debido a su naturaleza declarativa, un interfaz no contiene el código de los miembros que expresa;dicho código será escrito en las clases que implementen el interfaz. 32 Interfaces Concepto: Clara relación con el polimorfismo. El mismo interfaz, implementado en distintas clases, podrá tener a su vez código distinto, con lo que los objetos de diferentes clases que implementen un interfaz común, pueden tener un comportamiento diferente. 33 Interfaces Pasos: Declaro Interface: Public Interface miinte miembros End Interface 34 Interfaces Pasos: En las clases que vamos a utilizar las definiciones de la interfaz emplearemos después de la declaración de la clase, la palabra clave Implements junto al nombre del interfaz que deseamos que implemente la clase. Para implementar un miembro de un interfaz, en el momento de escribir su declaración, utilizaremos la palabra clave Implements, seguida del interfaz y miembro que implementa. 35 Eventos y Delegados Eventos: Definición: Un evento es una señal que comunica a una aplicación que ha sucedido algo importante dentro de una aplicación, una notificación lanzada por un objeto, que podrá ser respondida por aquellos otros objetos interesados en darle soporte. 36 Eventos y Delegados Eventos: El emisor de eventos Un emisor de eventos, también denominado origen de eventos (event source o event sender), es un objeto capacitado para generar y lanzar eventos al sistema, que puedan ser recuperados por otros objetos preparados para realizar su tratamiento. 37 Eventos y Delegados Eventos: El emisor de eventos Para que un objeto pueda desencadenar eventos, en su clase debemos realizar dos tareas: Declarar el propio evento usando la palabra clave Event, especificando si es necesario una lista de parámetros que acompañan al evento. Los eventos se declaran en clases, estructuras, módulos e interfaces mediante la palabra clave Event, como se muestra en el siguiente ejemplo: Event AnEvent(ByVal EventNumber As Integer) 38 Eventos y Delegados Eventos: El emisor de eventos dos tareas: Lanzar el evento mediante la palabra clave RaiseEvent, seguida del nombre del evento a disparar. Si hemos declarado el evento con parámetros, deberemos añadir los valores para cada uno de los parámetros en el mismo orden en el que los hemos declarado. En Visual Basic .NET, los eventos se producen con la instrucción RaiseEvent, como en el ejemplo siguiente: RaiseEvent AnEvent(EventNumber) 39 Eventos y Delegados Eventos: El receptor de eventos Un receptor de eventos, también denominado manipulador de eventos (event receiver o event handler), es aquella parte del código cliente, que configuramos para que sea capaz de recibir los eventos generados por un objeto emisor. 40 Eventos y Delegados Eventos: El receptor de eventos Conexión de un emisor de eventos con un manipulador de eventos Existen dos medios para comunicar un evento con un manipulador de eventos: mediante las palabras clave WithEvents y Handles. Esta técnica tiene la ventaja de que permite escribir un código mucho más legible, en cuanto a la manipulación de eventos se refiere. mediante la palabra clave AddHandler. La ventaja en este caso, es que podemos asociar procedimientos manipuladores de evento dinámicamente durante el transcurso de la ejecución del programa. 41 Eventos y Delegados Eventos: El receptor de eventos WithEvents y Handles. Es el modo más sencillo para implementar la conexión entre un evento y un procedimiento manipulador de evento. En primer lugar, declaramos una variable del tipo de objeto cuyos eventos queremos capturar, en la zona de declaraciones del módulo, clase, etc., utilizando la palabra clave WithEvents.(no puede ser local) 42 Eventos y Delegados Eventos: El receptor de eventos WithEvents y Handles. A continuación, tenemos que escribir el procedimiento manipulador, que será invocado cada vez que se dispare el evento. Dicho procedimiento debe ser de tipo Sub, ya que un evento no puede devolver valores, por lo que no podremos utilizar un Function; también debemos finalizar su declaración con la palabra clave Handles, seguida del nombre de la variable del objeto que hemos declarado en la zona de declaraciones, y el nombre del evento que el procedimiento va a tratar. 43 Eventos y Delegados Eventos: El receptor de eventos AddHandler El enlace dinámico de eventos a sus correspondientes manipuladores, tiene la ventaja de que nos permite asociar el mismo evento a diferentes procedimientos manipuladores de dicho evento, durante el transcurso de la ejecución del programa. El objeto sobre el que vamos a manipular sus eventos podemos declararlo tanto a nivel local como en la zona de declaraciones, a diferencia del enlace estático, 44 Eventos y Delegados Eventos: El receptor de eventos AddHandler Para establecer un enlace dinámico entre un evento y un manipulador, utilizaremos la instrucción AddHandler. Esta instrucción, recibe dos parámetros NombreObjeto.NombreEvento. La dirección de entrada al procedimiento que deberá ejecutar el evento, y que obtenemos a través de la instrucción AddressOf. 45 Eventos y Delegados Delegados: Definición:es un objeto al que otros objetos ceden (delegan) la ejecución de su código. También se conocen como punteros a función con seguridad de tipos. Los delegados son útiles en situaciones donde es necesario un intermediario entre el procedimiento que realiza una llamada y el procedimiento que la recibe Al instanciar un delegado, se asocia con un método de instancia o compartido de un objeto, y posteriormente, durante la ejecución, será el delegado el que se encargue de ejecutar dicho método y no el propio objeto. También se pueden asociar los delegados con procedimientos Sub o Function de módulos. 46 Eventos y Delegados Delegados: Declaración: Para declarar un delegado, debemos utilizar la palabra clave Delegate, seguida del tipo de método (Sub o Function) al que posteriormente deberemos asociar el delegado; y finalmente, el nombre del delegado con la lista de parámetros y valor de retorno si es necesario. El lugar de declaración debe ser la zona de declaraciones de la clase o módulo. 47 Eventos y Delegados Delegados: Creación de delegados: declaramos una variable correspondiente al tipo del delegado. A continuación, conectamos el delegado con el procedimiento que posteriormente deberá ejecutar, empleando la palabra clave AddressOf, seguida del nombre del procedimiento. AddressOf devuelve el puntero o dirección de entrada al procedimiento, que será lo que utilice el delegado para saber la ubicación del procedimiento que debe ejecutar. Por último, para ejecutar el procedimiento al que apunta el delegado, llamaremos a su método Invoke( ). 48 Eventos y Delegados Delegados: Creación de delegados: Si delegamos un procedimiento que admite parámetros, a la hora de invocarlo con el delegado, debemos pasar al método Invoke( ) los valores de los parámetros, en el mismo orden que especifica el procedimiento. En el caso de delegación hacia funciones, cuando invoquemos el código con el delegado, deberemos obtener el valor de retorno de la función. 49