POO. Ejercicio clases y objetos.

IC588201

CLASES

CLASES

 

Ejemplo básico:

Comparar cómo hemos creado el objeto «a» y cómo el objeto «b«, el resultado es el mismo pero el objeto «b» fue creado directamente a partir de la clase «ClaseBasica» mientras que el objeto «a» fue creado a partir del objeto «Objeto«.

Veamos el ejemplo anterior ampliado:

IC311555Varias cosas a tener en cuenta, hemos ampliado la clase con un nuevo campo llamado «tantoporcien«, además como se trata de un campo que requiere un control sobre su valor ya que queremos que su valor esté comprendido entre 0 y 100, lo declararemos como private de forma que sólo pueda ser manipulado a partir de propiedades (TantoPorCien) o métodos (Resetea).

El resultado será:

Podemos mejorar nuestra clase implementando un método que imprima directamente en pantalla «Imprime«:


IC310764Propiedades autoimplementadas

Son una característica incluida a partir de la versión 3.0 de C# que hacen más concisa la declaración de una propiedad. Es posible aplicarla siempre que no exista «lógica» en los descriptores de acceso de la propiedad.

En el ejemplo anterior tenemos dos propiedades «IdCliente» y «Nombre», la primera sólo de lectura. Veamos como  quedaría si usáramos propiedades autoimplementadas.

 

MSDN: Propiedades Autoimplementadas


IC310764

 

 

Los constructores.

Son métodos que llevan el mismo nombre que la clase y se ejecutan automáticamente cuando se crea el objeto. Al igual que otros métodos pueden estar sobrecargados. Veamos un ejemplo de una clase «Alumno» con dos campos, un constructor sobrecargado y un método. No devuelven ningún tipo, ni siquiera «void». Nunca se le puede llamar de manera explícita en el código, únicamente implícitamente en la creación de una instancia de la clase. El constructor de una clase que no espera parámetro alguno es designado como «constructor por defecto» de la clase. Normalmente un constructor se encarga de la inicialización de campos.

El resultado será:

Ojo: si quisiéramos imprimir directamente el nombre o la edad de un alumno por ejemplo «Console.Write (a.nombre);» daría un error ya que se trata de un campo privado.

Otro ejemplo:

IC310764Orden de llamada de los constructores

Cuando se crean objetos de una clase derivada, antes de llamar a su constructor se llama a los constructores de la las clases base, empezando siempre por la más general y terminando por la más específica. Si añadimos en la clase derivada un constructor por defecto, debemos seguir algunas reglas:

  • Si el constructor de una clase derivada no invoca de forma explícita al constructor de la clase base (con la ayuda de la palabra reservada «base«), el constructor por defecto, si existe, lo hará de manera implícita.
  • Si una clase base no ofrece constructor por defecto, la clase derivada debe hace una llamada explícita al constructor de la clase base usando la palabra reservada base.

El resultado del programa será:

Veamos dos ejemplo con la clase «Asalariado» que tendría como  clase base la clase «Persona», ambos constructores tendrían el mismo efecto ya que la clase Persona sí tiene un constructor por defecto.

Ahora podríamos añadir un constructor sobrecargado en la clase Asalariado:

Aunque sería más correcto utilizar el constructor que ya existe en la clase Persona:

IC310765

Más sobre propiedades: «get» y «set».

Sobre nuestra clase Alumno vamos a crear las propiedades que nos permitan cambiar la edad y el nombre a un objeto ya creado.

El resultado será el mismo que antes.

IC310764Miembros estáticos (static) o compartidos: Se trata de una especie de campo común a todos los objetos de la clase. El siguiente ejemplo muestra como poder llevar un contador de los objetos Alumnos creados, para ello crearemos el campo «contador» y la propiedad «Contador» ambas con la propiedad «static». Los miembros compartidos o estático son campos, propiedades o métodos a los que pueden acceder todas las instancias de una clase.

Bien muy bien cuando cuando queremos gestionar datos que no son específicos de una instancia de clase sino de la propia clase.

La salida sería:

Ojo esto no está permitido:

Daría error porque la utilización de un miembro compartido mediante un instacia de la clase está prohibida.

 

IC310764

Como acceder a una propiedad de una clase base

A veces un objeto hijo necesita acceder a un campo o propiedad de la clase base de la cual desciende.

Por ejemplo una asignación: ((ClasePadre)ObjetoHijo).Propiedad = Valor;

El resultado sería:

Destructor de un objeto:

Los destructores son otros métodos particulares de una clase. Llevan el mismo nombre de la clase precedida del signo «~» (Alt+126) y no pueden llevar ningún parámetro, por lo que no puede haber más de un destructor, es decir no permite la sobrecarga.

Declaración «protected».

Cuando definimos un campo, propiedad o método como «public», está será accesible desde cualquier sitio. Si la declaramos como «private» sólo es accesible  en la clase donde está definida, si una clase hereda de otra campos, propiedades o métodos privados, está clase tampoco podrá acceder a los campos, propiedades o métodos de la clase heredada. Para solucionar esto se utiliza la declaración «protected» que permite que una clase «hija» pueda acceder a los métodos de su clase «padre», sin que estos sean accesibles desde otros sitios.

Arrays de objetos

Muchas veces necesitamos crear más de un objeto de la misma clase para ello, imaginemos un equipo de fútbol, podríamos crear 11 objetos j1, j2, j3 etc. o bien un array de 11 objetos.

Ahora bien imaginamos que tenemos la clase: «ClaseJuagador» pero que a partir de ella hemos creado 2 nuevas clases «ClasePortero» y «ClaseJugadorCampo» para este caso también nos serviría un array y podría quedar de la siguiente forma:

Funciones Virtuales: «override».

Siguiendo con el ejemplo del equipo de futbol, si en vez de un constructor tenemos un método llamado «Jugar»:

Si ejecutamos:

Saldrá correctamente:

Pero por otro lado si creamos un array:

Todos darán la misma respuesta a pesar de que cada elemento del array es una clase distinta.

ClaseCuadro

Ejemplo de una clase «ClaseCuadro«:
La clase está compuesta por Campos, Propiedades, Métodos y Eventos.

Campos y propiedades: aunque para el usuario de un objeto los campos son similares a las propiedades, estas últimas modifican u obtienen los valores de los campos mediante los descriptores de acceso get y set. Los campos deberán ser declarados como privados (private) si queremos asegurarnos que su valor sea controlado por el código de las propiedades.

Métodos y eventos: Los métodos nos permiten comunicarnos con los objetos que componen una aplicación, pero los objetos también tienen la posibilidad de transmitirnos sus reacciones generando eventos. En el diseño de la interfaz gráfica de una aplicación ya que nos permite obtener datos relativos a las acciones efectuadas por el usuario.

 

 

 

IC588201

OBJETOS

Instanciar las clases.

 

  1. Declaración de una variable que permita el acceso al objeto
  2. Creación del objeto

Podemos combinar ambas operaciones en una única línea:

Para utilizar otro constructor deberemos especificar la lista de parámetros y en función del tipo y número de parámetros el operador new llamará al constructor correspondiente:

Inicialización de una instancia a la vez que es creada:

Esto sería lo mismo que hacer:

Inicialización de una colección

 

Destrucción de una instancia

La destrucción es automática, el CLR (common Language Runtime) vigila que todas las instancias sean accesibles (es decir que existan para la aplicación), si no encuentra ningún medio para acceder a ella el objeto queda marcado como huérfano y cuando la memoria de la aplicación decrezca entonces el Garbage Collector (Recolector de basura) intervendrá y eliminará los objetos huérfanos. Es durante este proceso cuando los destructores de cada uno de los objetos.

Es posible forzar el Garbage Collector, pero es un trabajo relativamente costoso que hay que utilizar con precaución: