Hola a todos!!
Comenzamos la práctica 5 el viernes 28 de marzo. Escuchamos en clase las explicaciones sobre polimorfismo, sobreescritura, clases abstractas e interfaces. Definiremos con nuestras palabras estos conceptos.
Entendimos el polimorfismo como un sinónimo de sobrecarga, es decir, un método que se llama igual pero implementado de distintas formas. Hay dos tipos de polimorfismo: el de clase, la herencia permite el polimorfismo de clases, ya que un objeto puede comportarse como un objeto de distintas clases. Y polimorfismo de método, por ejemplo, cuando en una clase tenemos varios constructores que se llaman igual pero se les pasan diferentes parámetros, tienen el mismo nombre pero no se codifican de la misma manera.
Es diferente la sobrecarga a la sobreescritura. La sobreescritura es, en herencia, escribir un método igual en la subclase que el de la clase padre pero implementándolo.
Continuamos con el concepto abstracto. Las clases abstractas son un concepto entre clase e interfaz. Pueden tener métodos abstractos y constantes, pueden tener métodos con implementación y atributos, incluso constructores (aunque sólo sirven para llamarlos con super( ) desde las clases hijas, ya que las clases abstractas no se pueden instanciar). Las clases que tienen métodos abstract son abstractas. Un método abstracto es un método sin implementar, se puede implementar si la clase que hereda, de la que tiene el método abstract, la codifica.
Relacionado con el abstract están los interfaces. Una interfaz es como una plantilla. Se realiza mediante métodos abstractos que ya se escribirá su código en las clases que implementen esa interfaz. Las interfaces solo pueden contener métodos abstractos (sin código) y constantes. Todos los métodos son public abstract, se ponga o no, y constantes, public final static. Si llevan atributos también son siempre static y final. Una interfaz puede heredar de otra u otras. También puede ir vacía; y se puede declarar public. Una clase puede implementar una o varias interfaces, y se debe tener cuidado con que en alguna de las interfaces exista un método igual (que no sea sobrecarga).Las interfaces o bien se extienden o bien se heredan para configurar otras clases. Para que una clase implemente una interfaz se escribe: class + (nombre de la clase) + implements + (nombre de la interfaz)
Respecto al EJERCICIO 1 de la sobreescritura del método toString( ), nosotros en la anterior práctica, utilizamos siempre que pudimos el super() ya que reutilizamos el código y es más práctico hacerlo así en lugar de volver a escribir todo, vaya chorrada trabajar de mas. Se puede realizar esto sin preocuparse de que Java se vuelva loco ya que, dependiendo del tipo de objeto con el que estés llamando al método toString(), así invocará al toString() de la clase correspondiente al objeto.
En el EJERCICIO 2 se explica el uso de la interfaz Almacenable en la clase Clase.
Cuando llegamos al EJERCICIO 3 no nos enterábamos de nada. Esto era totalmente nuevo para nosotros. No sabíamos ni por donde pillarlo. Implementamos la clase ComponenteGrafico. Primero hicimos el constructor, el que es como siempre y no hay ningún tipo de dificultad en rellenar, pero al siguiente método llega lo “chungo”. Gracias a nuestras compañeras, que nos ayudaron mucho, pudimos sacar algo en claro. Sabíamos que el método paint() se implementaría invocando a los métodos pintaFondo() y pintaBorde(), pero ¿cómo se invocaría a esos métodos? Dijimos: “pues si nos pasan por parámetro un objeto Graphics vamos a probar creando uno e invocando a los dos métodos con ese objeto”. Así que pensamos que habría que poner g.pintaFondo(), pero no, nos fijamos en esos métodos y a ellos también se les pasa un objeto graphics por parámetro, lo lógico entonces es que la llamada se hiciera pintaFondo(g), por lo que no hacía ninguna falta crearse un objeto graphics dentro del método.
A la hora de hacer el pintaFondo() y pintaBorde() no sabíamos que métodos utilizar, el API es enorme, aunque nos dejasen escrito la descripción de los pasos que debíamos seguir para implementar cada método en la clase ComponenteGrafico, no lográbamos dar con la solución. Por más que buscábamos y mirábamos para enterarnos de algo, teníamos que acabar pidiendo ayuda a nuestras amables compañeras, el profesor estaba bastante ocupado. Ellas nos fueron explicando lo que utilizar y por qué. En el primer método, nos decían que estableciésemos el color de fondo, pero ¿cómo? y a continuación rellenamos el rectángulo con ese color, ¿PERO CÓMO? Nuestras cabezas no paraban de dar vueltas. Mirábamos en el API, entre que todo está en inglés, que la teníamos que ir mirando cada método que había uno por uno traduciendo lo que hacían para ver si descubríamos lo que andábamos buscando. Hasta que se nos encendió la bombilla ¿y si ponemos el set nuestro de cada día? Pues si, así era, pasándole como parámetro el atributo colorFondo. ¿Y lo qué seguía? Más incógnitas. Ya cuando no pudimos mas preguntamos a nuestras compañeras de al lado, nos explicaron que había que usar el fillRect, el cual mirando en el API, la descripción se ajustaba con lo pedido. Este lo que hace es rellenar un rectángulo con el color establecido de antes, el rectángulo quedará relleno de este color. Al principio cometimos un error y colocamos primero el fillRect y después el set, y nos salía porque hay que ponerlo por orden sino no se sigue esa “jerarquía” y se escribe una cosa encima de otra.
También nos encontramos el mismo estilo de problemas a la hora de realizar el pintaBorde. Esta vez, cuando vimos escrito establecer el color para pintar el borde, automáticamente tiramos del set dándole el parámetro colorBorde. Pero ¿con qué dibujaríamos un rectángulo? Nos tiramos otro largo rato buscando en el API. El inglés dificultaba las cosas pero más o menos nos enterábamos. Dijimos: “si draw significa dibujar, será algún draw de estos a la fuerza”. Y MILAGRO!! Un drawRect, debe dibujar un rectángulo por deducción, y fue de esa forma. Seguido del set colocamos el drawRect para ser el orden de la cosas, porque si lo colocásemos del revés (como nosotros muy mal hicimos al principio), no sale.
Por seguir este orden, tras cometer varios errores, comprendimos porque debía ir en paint primero el pintaFondo y después el pintaBorde. Si se colocase al contrario el fondo taparía el borde y no se distinguiría, no habría borde.
Tras un mal rato de desesperación, que ya empezó a echar por tierra todas nuestras pequeñas esperanzas de aprobar la asignatura al quedarnos pasmados viendo esta práctica, decidimos seguir en nuestro empeño de aprender algo continuando con la clase Botón.
Implementamos sin problemas el constructor, ayudándonos de nuestro amigo super. El método paint de esta clase ya nos dio más guerra. El primer paso era pintar el componente gráfico, pero como muy bien nos dicen, como hereda de dicha clase, entonces super.paint() y lo pintamos. ¿cómo establecemos el color del texto?¿tendremos que pasarle un String y el color? Al principio miramos en el API oooooootra vez, hasta que dijimos, todo lo que sea establecer color con set, pasándole por parámetro el atributo colorTexto. Y como dibujamos el texto para que quede centrado, ¿con otro draw? Si se trata de dibujar entonces quizá, pero tendrá que ser uno al que le demos un String, en el que nosotros escribiremos lo que queremos que aparezca en el botón. Y ENCONTRAMOS!! El drawString. Ahora el problema era dejar centrado la palabra escrita en el botón que aparecía por la pantalla.
No conseguimos nada mas que crear el botón y después nos encontramos con el problema de que queríamos que en el centro del botón aparezca escrito botón, pero no quedaba centrado. Estábamos ya hartitos del botoncito. Lo pasamos mal al ver toda la práctica que quedaba por delante y que sin ayuda no avanzábamos. En la biblioteca viene mucha información sobre interfaces gráficos pero mucha, y ¿qué debemos saber y qué no de todos esos pedazo de libracos?
Esta práctica nos ha parecido bastante compleja de realizar y muy falta de información para llegar y ponerte a hacerla sin tener ni idea en este campo. Hubiésemos agradecido explicaciones sobre este tema auque fuese de lo más básico.
Aún no hemos terminado la práctica por completo porque nos hemos topado con algunas difcultades, en cuanto la terminemos la colgamos entera como es de costumbre con su código y su ejecución.
Hasta pronto.
Chic@s! se os ve que teneis mucha idea! que suerte! La verdad es que vuestra práctica 6 ayuda bastante, porque estabamos un poco perdidillas.
Si algun día teneis tiempo pasaros por nuestro blog!
Por: anaypatri el Abril 16, 2008
a las 11:56 am