Developer's Diary

14 enero, 2011

Curso C# – Creacion de clases III

Hemos llegado a la tercera entrega de creación de clases, dentro del curso de C#. En esta entrega, vamos a implementar el diseño que realizamos en la última entrega de nuestra aplicación de las pelotas, que mal llega a sonar.

También vamos a explicar la función de los constructores dentro de nuestra aplicación y explicar el funcionamiento de las propiedades dentro de una clase.

En la anterior entrega, dejamos nuestras clases prediseñadas, pendientes de agregar sus respectivos constructores. Teníamos una clase Pelota, con cuatro atributos y un método, con una pelota hija con nombre PelotaTenis.

No obstante, siempre que se crea una clase dentro de c#, se genera por defecto un constructor que no recibe parametros. El constructor o constructores de una clase, es el método que nos permite instanciar nuestra clase en un objeto. No olvidemos que la clase es el concepto virtual, por así decirlo y un objeto es la instanciación de la clase.

En C# debemos declarar un constructor, como si se tratase de un método, normalmente es publico o protected. Si hiciesemos un constructor de tipo privado, no tendría sentido alguno. Ya que debe ser un método al que tengamos acceso para poder instanciarlo o construirlo.

El constructor podemos añadirlo tanto en el diseñador de la clase, marcando en la opción de Añadir Constructor o lo podemos hacer programaticamente. Tenemos que tener en cuenta que Visual Studio se encarga de implementar todos los cuerpos dentro del código, sin que nosostros hagamos nada. Posteriormente debemos añadir las funcionalidades.

El constructor que vamos a crear para la clase padre, será de tipo Protected, aceptara cuatro parametros, que corresponderán a los cuatro atributos que le hemos asignado. Vamos a situar el constructor en acceso protegido, para que la única manera que podamos acceder a la clase sea mediante alguna de sus clases hijas.

El constructor de la clase hija, PelotaTenis, no recibirá ningún parametro, siempre que llamemos al constructor de una clase hija, deberemos llamar consigo al constructor de la clase padre, por lo tanto. El constructor de la clase hija queda así:

public PelotaTenis()

:base(10 , 5 , “Pelota de Tenis” , “Amarilla”)

{}

Como podemos comprobar,  la llamada a la clase padre, se realiza mediante la palabra reservada base, solo se sitúan los dos puntos en el constructor, si realizamos cualquier otra llamada, solo es necesario poner base.

Ya tenemos nuestros constructores prediseñados. Cuando llamamos al constructor de nuestra PelotaTenis, llamamos al constructor de la clase padre Pelota, no obstante, podríamos introducir algún parametro dentro del constructor de la clase PelotaTenis y pasarlo directamente a la llamada del constructor padre. Si por ejemplo, las pelotas de tenis, tuviesen un tamaño diferente, podríamos crear un constructor de la siguiente manera:

public PelotaTenis(int tam)

:base(tam , 5 , “Pelota de Tenis” , “Amarilla”)

{}

En este caso, permitimos un nuevo parametro, además podemos mantener ambos métodos, gracias a la sobrecarga.

Tras comprender en cierta parte como funciona un constructor de la clase, vamos a hablar de las propiedades.

Una propiedad no es un tipo de dato en sí, si no es un puente entre el atributo que nos permite controlar con mayor capacidad los mismos. Una propiedad contiene los métodos Set(Asignar) y Get(Obtener). El primer método, permite modificar el valor del atributo en cuestión y el segundo permite recuperar el valor. Podemos modificar el cuerpo de estos métodos, como cualquier otro, si eliminamos el método Set de una de nuestras propiedades, la propiedad se volverá de solo lectura y en caso de eliminar el Get, se convertirá de solo escritura. Es más frecuente encontrar propiedades tanto de solo lectura, como con ambos métodos.

Inicialmente podemos llegar a pensar, que deberíamos prescindir de las propiedades y situar los atributos en valores publicos. Ya que finalmente, como bien hemos indicado una propiedad solo permite ser un nexo entre el atributo, que normalmente es privado, con el exterior. De hecho, al acceder a una propiedad el tiempo de ejecución suele ser un poco mayor. Pero lo interesante de las propiedades es que podemos, antes de devolver el atributo realizar ciertas comprobaciones, ya que estamos actuando con métodos Get y Set.

Volvamos a nuestro ejemplo y pensemos que todas nuestras pelotas, han sido registradas con un peso que no eran hinchadas, tendríamos un peso incorrecto en nuestros atributos, pero podríamos mostrar un valor completamente distinto dentro de las propiedades.

Tomando la propiedad desde tamaño desde O.

public Property Tamaño

{

get

{

return m_tamaño;

}

set

{

m_tamaño = value;

}

}

Así quedaría incialmente, si por ejemplo, el tamaño inflada es una unidad más, podemos modificar el valor del get e incrementarle un valor más.

public Property Tamaño

{

get

{

return m_tamaño + 1;

}

set

{

m_tamaño = value;

}

}

De esta manera tendremos la devolución de nuestro tamaño con una unidad más, cuando por ejemplo realicemos calculos o mostremos en pantalla.

El tiempo que podamos perder en acceder a la propiedad y posteriormente al atributo, es insignificante para las posibilidades que nos aporta las propiedades, además, si no usaramos las propiedades, perderíamos una de las caracteristicas de la programación orientada a objetos que es el encapsulamiento.

Si es cierto, que si en un proceso o método, usaramos varias veces el acceso a la propiedad, podría ser interesante guardarla en una variable local para así acceder en menos ocasiones a la propiedad y evitar la perdida de tiempo.

Actualmente nuestra aplicación está diseñada, con sus constructores, pero todavía no hemos rellenado el cuerpo de los métodos. Además, la clase hija no tiene ninguna diferencia, sobre la clase padre. Por lo cual, aunque haya una herencia, no tenemos ninguna diferencia entre padre e hijo.

Por lo tanto vamos a introducir un nuevo método dentro de nuestra PelotaTenis, que sea saque, también vamos a introducir un nuevo atributo llamado numero_botes, de esa manera, el saque tendrá una cantidad de botes igual, antes de realizar el saque.

Espero que seais capaz de hacerlo, aunque voy a dejar el código adjunto de la aplicación terminada. Solo una pista, debeis añadir también un valor al constructor para los botes.

Adjunto el proyecto comprimido. Lo podeis descargar de aquí.

Un saludo

Anuncios

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: