Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ST0242 039
DIS
28 de abril de 2020
Entrega: Mayo 15 hasta las 18:00
1. Preliminares
El objetivo de este taller es repasar los conceptos de herencia, relaciones entre
clases y clases abstractas.
Este taller es calificable y hace parte del 10 % de seguimiento que tiene la
materia. La entrega del taller por el respositorio de subversion. Los problemas
que involucran programación se implementan en projectos de BlueJ y se suben
al repositorio. Los ejercicios son para el aprendizaje de cada estudiante. No es
necesario entregar la solución.
Para los problemas cuya solución es texto, respondalos en el README.TXT
del proyecto creado en BlueJ (El README se muestra en BlueJ como una hoja
de escritura).
Introducción
La Programación Orientada a Objetos ha permitido un avance muy importante
en la industria de software. Una de las principales causas es que facilita la Reuti-
lización del Software. Esto se refiere a lo siguiente: Una vez un miembro de un
equipo de desarrollo ha escrito un código que funciona bien, es posible que otro
miembro del equipo lo utilice en otra parte de la aplicación; evitando ası́ “reinven-
tar la rueda”.
1
La mayor parte de los expertos coinciden en que los componentes principales
de la programación orientada a objetos (POO u OOP por sus siglas en inglés - Ob-
ject Oriented Programming) [3] son: encapsulamiento, herencia y polimorfismo.
En el curso ya hemos visto el concepto de encapsulamiento. Se refiere a que
los atributos de una clase, cuando se declaran privados, quedan encapsulados al
interior de la misma. Esto es, las otras clases solamente tienen acceso a esos atri-
butos a través de métodos que el programador de la clase ha construido. Esto
presenta dos venajas: (i) Unos métodos bien escritos garantizan la integridad y se-
guridad de los datos y (ii) el programador puede, en un futuro, hacer cambios en
la forma como se almacenan los atributos al interior del objeto. Siempre y cuando
la forma de invocar los métodos no cambie, el programador de la clase puede, por
ejemplo, usar alguna estructura de datos más eficiente, y no es necesario hacer
cambios en otras clases.
Esta semana hemos introducido los temas de herencia y polimorfismo. En
este taller profundizaremos en la manera en que se implementan estos conceptos
en Java.
2. Herencia
Wikipedia [1] define la herencia, en el contexto de Programación Orientada a
Objetos, de la siguiente manera:
Cuando usamos la herencia entre clases, por ejemplo al decir que la clase B
hereda de la clase A, estamos diciendo que la clase B (o clase derivada) hereda
tanto los atributos como los métodos de la clase A (o clase base). Esto es: no es
necesario incluir en B la declaración de los atributos ni los métodos.
Ahora bien, lo que ocurre, es que el programador de la clase B puede hacer lo
siguiente: (i) Utilizar los atributos y métodos de la clase A sin cambio alguno (ii)
Sobreescribir (o redefinir) algunos atributos o métodos de tal forma que funcionen
de manera diferente. (iii) Agregar nuevos atributos y métodos. En este taller vamos
a ver varios ejemplos de las situaciones anteriores.
2
Figura 1: Version 1 del juego
En los siguientes párrafos, vamos a crear las clases para un juego RPG [5]
Como punto de partida, vamos a definir que nuestro juego RPG tendrá: Humanos,
Monstruos y Armas.
Para comenzar, tendremos las clases descritas en la figura 1.
Inicialmente la clase Humano solamente tiene el atributo para el nombre y el
número de vidas con que cuenta el personaje. Cuando el número de vidas llega a
0, el jugador pierde el juego.
1 p u b l i c c l a s s Humano
{
3 S t r i n g nombre ;
int vidas ;
5 }
3
1 p u b l i c c l a s s Monstruo
{
3 S t r i n g nombre ;
i n t sangre ;
5 }
La clase Arma contiene la información del nombre del arma, ası́ como la can-
tidad de daño que le infringe al enemigo. Un punto de daño equivale a un litro de
sangre de un monstruo y equivale a 1/10 de la vida de un humano.
1 p u b l i c c l a s s Arma
{
3 S t r i n g nombre ;
i n t danyo ;
5 }
1 p u b l i c c l a s s Orco e x t e n d s M o n s t r u o
{
3
}
4
Figura 2: Representación de la relación de herencia en BlueJ
Notar el uso de la palabra clave extends, que indica que la clase Orco hereda
de la clase Monstruo.
Una vez hemos creado la clase Orco, BlueJ nos muestra la relación de herencia
con la clase Monstruo con una flecha continua que tiene un triángulo en la punta.
5
Agregar en Orco un atributo tipo S tring que permita almacenar el valor del
gruñido.
p u b l i c c l a s s Monstruo
2 {
S t r i n g nombre ;
4 i n t sangre ;
6 p u b l i c M o n s t r u o ( S t r i n g nombre , i n t s a n g r e ) {
t h i s . nombre = nombre ;
8 t h i s . sangre = sangre ;
}
10 }
p u b l i c c l a s s Orco e x t e n d s M o n s t r u o
2 {
String grunyido ;
4
p u b l i c Orco ( S t r i n g nombre , i n t s a n g r e , S t r i n g g r u n y i d o ) {
6 s u p e r ( nombre , s a n g r e ) ;
t h i s . grunyido = grunyido ;
8 }
10 }
6
la clase base mediante la invocacaión de su constructor, y en el caso de su propio
atributo (grunyido), se asigna de la manera que hemos visto anteriormente en el
curso.
Ejercicio 4. Crear una clase Dragon. Esta clase también hereda de Monstruo
y, por lo tanto, comparte los atributos nombre y sangre. Los dragones tienen un
atributo adicional, y es el tipo de escamas. Algunos tienen escamas de metal y
otros de cuero. El tipo de escamas se guarda en una variable que se llama escamas
y es de tipo S tring.
p u b l i c c l a s s Orco e x t e n d s M o n s t r u o
2 {
String grunyido ;
4
p u b l i c Orco ( S t r i n g nombre , i n t s a n g r e , S t r i n g g r u n y i d o ) {
6 s u p e r ( nombre , s a n g r e ) ;
t h i s . grunyido = grunyido ;
8 }
10 p u b l i c void imprimirNombre ( ) {
System . o u t . p r i n t l n ( ”Mi nombre e s : ” + nombre ) ;
12 }
7
14 }
3. Polimorfismo
Algo es polimórfico cuando tiene varias formas. En Programación Orientada
a Objetos tiene el siguiente significado, tomado de Webopedia: [4]
3.1. Referencias
Problema 5. (20 %) Crear lo siguiente:
Vamos a crear una clase Juego, donde se van a manejar las referencias a
todas las instancias de Humano y Monstruo del juego. Inicialmente vamos
a tener una referencia a un Monstruo
8
Vamos a agregar un método moverse() en la clase Monstruo. Como se defi-
ne en la clase base, se hereda automáticamente en las clases Orco y Dragon.
p u b l i c c l a s s Juego
2 {
M o n s t r u o m1 ;
4
p u b l i c v o i d a s i g n a r M o n s t r u o ( M o n s t r u o m1 ) {
6 t h i s . m1 = m1 ;
}
8
La clase Monstruo:
1 p u b l i c c l a s s Monstruo
{
3 p r o t e c t e d S t r i n g nombre ;
protected i n t sangre ;
5
p u b l i c M o n s t r u o ( S t r i n g nombre , i n t s a n g r e ) {
7 t h i s . nombre = nombre ;
t h i s . sangre = sangre ;
9 }
11 p u b l i c void moverse ( ) {
13 }
}
La clase Orco:
9
Figura 3: Representación de la relación entre clases en BlueJ
p u b l i c c l a s s Orco e x t e n d s M o n s t r u o
2 {
String grunyido ;
4
p u b l i c Orco ( S t r i n g nombre , i n t s a n g r e , S t r i n g g r u n y i d o ) {
6 s u p e r ( nombre , s a n g r e ) ;
t h i s . grunyido = grunyido ;
8 }
10 p u b l i c void imprimirNombre ( ) {
System . o u t . p r i n t l n ( ”Mi nombre e s : ” + nombre ) ;
12 }
14 p u b l i c void moverse ( ) {
System . o u t . p r i n t l n ( ” Soy un o r c o , e s t o y c o r r i e n d o ” ) ;
16 }
}
Problema 6. (20 %) Crear una instancia de Juego. Ahora crear una instancia
de Orco y asignarla al juego usando el método asignarMonstruo(). ¿Funciona,
10
si o no? Por qué puedo asignar un objeto tipo Orco a una variable que espera algo
de tipo Monstruo? Explicar.
Ejercicio 10. Ahora crear una instancia de Dragon y asignarla al juego. ¿Fun-
ciona, si o no? Explicar.Ahora vamos a modificar la clase Juego para que alma-
cene un arreglo de 4 monstruos. Los monstruos serán creados y asignados en el
constructor del juego.
Ejercicio 11. En este punto, debe agregar un método moverse a la clase Dragon,
en el cual se diga que el dragón vuela.
Tambien vamos a crear un método moverMonstruos, que va a invocar el méto-
do moverse de cada uno de los monstruos almacenados en el arreglo.
El código queda ası́:
1 p u b l i c c l a s s Juego
{
3 Monstruo [ ] a r r ;
5 public Juego ( ) {
arr = new M o n s t r u o [ 4 ] ;
7 arr [ 0 ] = new Orco ( ” Garnag ” , 1 0 , ” g a r r ” ) ;
arr [ 1 ] = new Dragon ( ” B r e n t o n ” , 2 0 , ” m e t a l ” ) ;
9 arr [ 2 ] = new Orco ( ” Rogthun ” , 5 , ” p u r r ” ) ;
arr [ 3 ] = new Dragon ( ” Draco ” , 4 0 , ” c u e r o ” ) ;
11 }
13 p u b l i c void moverMonstruos ( ) {
f o r ( i n t i = 0 ; i < a r r . l e n g t h ; i ++) {
15 a r r [ i ] . moverse ( ) ;
}
17 }
}
11
ya que, en teorı́a, se está invocando el método moverse a cada entrada del arreglo
de Monstruos, esto es, se está invocando el moverse a los Monstruos. Sin embar-
go, evidentemente se invoca el método especı́fico de los dragones y el método
especı́fico de los orcos. Explicar con sus palabras.
12
20 f o r ( M o n s t r u o m: a r r ) {
m. m o v e r s e ( ) ;
22 }
}
24
}
Ejercicio 16. ¿Qué ocurre ahora si se trata de hacer una instancia de la clase
Monstruo? Explique con sus palabras.
13
Ejercicio 17. Implementar dos clases derivadas de la clase Humano. Una será
un jugador normal y la otra será un NPC (non-playable character). Definir al-
gunos atributos comunes que se manejarán en la clase Humano y otros que se
manejarán en cada clase derivada. Crear un método común en la clase Humano
que permita implementar un ejemplo de polimorfismo desde la clase Juego. Las
referencias a los humanos de manejarán en un ArrayList desde la clase Juego.
Ejercicio 18. Implementar dos tipos de armas. Una será para combate de con-
tacto y la otra para un rango de distancia. El jugador podrá tener 0 o muchas armas.
Lo anterior se representará como un ArrayList de armas en la clase Jugador. Im-
plementar algún ejemplo de polimorfismo entre la clase Jugador y la clase Arma.
Ejercicio 19. Crear una clase Tablero como una matriz de celdas. Cada celda
puede contener un Monstruo o un Humano o estar vacı́a. El jugador puede indicar
el movimiento de su representación. Si el jugador está adyacente a un monstruo, se
atacarán mutuamente con el arma que tengan activa y se lanzará un dado (número
random) para calcular el daño, utilizando un sistema de turnos.
Nota: crear y jugar este juego puede ser adictivo. No se olvide de su vida
social.
4. Bibliografı́a
Referencias
[1] Inheritance in object oriented programming. https://en.wikipedia.
org/wiki/Inheritance_(object-oriented_programming). Accessed:
2020-04-27.
14
[5] Rol-playing game. https://en.wikipedia.org/wiki/Role-playing_
video_game). Accessed: 2020-04-27.
15