ADSLZone necesita gestionar de una manera diferente a la que ahora utiliza, toda la base de datos de la web. Teniendo en cuenta que desean gestionar todos los usuarios de la web (tanto zoneros, como miembros del staff) los Gurús de la página se reunieron para decidir como debía hacerse esta gestión y llegaron todos al siguiente consenso: - Todos los miembros son usuarios - Los usuarios tendrán los siguientes atributos privados ->Un entero que indica cuantos mensajes lleva. ->Un string que contiene el correo electronico. ->Un string que contiene el nombre(nick) en el foro. - Los usuarios tienen los siguientes métodos: ->Incrementa en 1 el número de mensajes. ->Decrementa en 1 el número de mensajes. ->Modifica el correo electronico. Los Gurús de AdslZone, que son muy exigentes, quieren que haya dentro de los usuarios dos clases: moderadores, administradores. Los moderadores tienen moderadores tienen los siguientes atributos privados ->Un entero que indica cuantos mensajes lleva. ->Un string que contiene el correo electrónico. ->Un string que contiene el nombre(nick) en el foro. ->Un entero que indique el número post que han mandado a la papalera. -Los moderadores tienen moderadores tienen los siguientes métodos: ->Incrementa en 1 el número de mensajes men sajes ->Decrementa en 1 el número de mensajes ->Modifica el correo electrónico ->Incrementa en 1 el número de mensajes que ha mandado a la papelera por incumplir las normas Los administradores Los administradores tienen los siguientes atributos privados: ->Un entero que indica cuantos mensajes lleva. ->Un string que contiene el correo electrónico. ->Un string que contiene el nombre(nick) en el foro. ->Un entero que indique el número post que han mandado a la papalera. ->un entero que indique el número de baneos que ha realizado. Y tienen los siguientes métodos.
->Incrementa en 1 el número de mensajes. ->Decrementa en 1 el número de mensajes. ->Modifica el correo electrónico. ->Cambia su propio nombre de usuario. ->Incrementa en 1 el número de mensajes que ha mandado a la papelera por incumplir las normas. ->Incrementa en 1 el número de baneos de usuarios por ser spammers. De aquí deducimos que tenemos una superclase clara, los usuarios, y despues dos subclases, los moderadores y los administradores. El siguiente esquema aclara como se requiere la implementación de las tres clases:
Se nos pide, implementar las tres clases con sus respectivos métodos. Darse cuenta que hay atributos y métodos repetidos en las subclases. Esto a la hora implementarlo no es necesario porque ya sabéis que tenemos extends. Ya sabéis que si tenéis alguna duda nos lo podéis consultar tanto a Sergio, como a mí. En la siguiente entrega pondremos la solución con explicaciones detallada para que los conceptos queden más claros.
Polimorfismo
La palabra polimorfismo viene de “múltiples formas”. Las operaciones polimórficas son aquellas que hacen funciones similares con objetos diferentes. Ejemplo: suponer que existe la clase Figura y sus subclases
- Círculo - Cuadrado - Polígono
Todas ellas con las operaciones: - dibuja - borra
Nos gustaría poder hacer la operación polimórfica mueveFigura que opere correctamente con cualquier clase de figura: mueveFigura borra dibuja en la nueva posición Esta operación polimórfica debería:
• llamar a la operación borra del Círculo cuando la figura seaun círculo • llamar a la operación borra del Cuadrado cuando la figura seaun cuadrado • etc.
El polimorfismo en Java consiste en dos propiedades: 1. Una referencia a una superclase puede apuntar a un objeto de cualquiera de sus subclases.
2. La operación se selecciona en base a la clase del objeto, no a la de la referencia.
Gracias a esas dos propiedades, el método moverFigura sería:
Y podría invocarse de la forma siguiente:
• Gracias a la primera propiedad el parámetro f p uede referirse a cualquier subclase de Figura. • Gracias a la segunda propiedad en mueveFigura se llama a las operaciones borra y dibuja apropiadas.
El lenguaje permite que una referencia a una superclase pueda apuntar a un objeto de cualquiera de sus subclases pero no al revés
Justificación:
• un coche es un vehículo - Cualquier operación de la clase Vehículo existe (sobrescrita o no) en la clase Coche.
• Un vehículo no es un coche - Sería un error tratar de invocar la operación:
- Por esa razón el lenguaje lo prohíbe. Hasta aquí el volumen de hoy, sólo nos falta un volumen para acabar todo lo relacionado con la herencia. En el siguiente volumen como indicábamos anteriormente vamos a tratar los modificadores de acceso en Java y la conversión de referencias y os daremos un breve resumen con los aspectos más importantes del polimorfismo y de la herencia. Podría decirse que es la base para programar utilizando estas técnicas.
Lo primero de todo vamos a hacer la clase principal, es decir la clase de la cual dependen las otras dos, la clase Usuario.
Como observáis, esta clase no tiene ningún tipo de complejidad y como va a ser la clase que jerárquicamente esté por encima de las otras dos y no va a haber ninguna más por encima de ella de la cual haya que heredar métodos o atributos, el constructor es simple. Ahora vamos con las clases hijas, primero con la clase Moderadores.
Pensaréis que faltan muchos métodos y que la clase esta incompleta, pero no es así. Todos los métodos que necesita, así como los atributos los puede coger de la clase de la cual extiende, es decir, Usuario. Nota: como pongo en un comentario, es importante que la llamada a la superclase sea la primera en el constructor, ya que si no, no compilará.
Vamos ahora con el cógido de la clase de los Administradores.
Como estáis viendo, en las clases hijas únicamente se declaran y se crean los métodos que no posean la subclase. Pero os voy a dejar en el aire una cuestión, como podéis ver, falta un método en los administradores, el que cambia el nombre de usu ario. Si os paráis a pensar es que lo más lógico hasta ahora es crearle en la clase Administradores, pero ¿creéis que funcionaría? La respuesta es no, por una sencilla razón, el atributo nick de la clase Usuario es privado y no tenemos visibilidad sobre él. Podemos hacer varias cosas pe ro la más correcta es incluir el método en la clase Usuario.