Professional Documents
Culture Documents
CAPTULO 5
HERENCIA Y
POLIMORFISMO
Autor: Ing. Csar Villacs Silva
Introduccin
Nombre
Crculo
Datos
r = radio
Rectngulo
a = ancho
b = largo
Tringulo
a, b, c = lados
s = semipermetro
Permetro
rea
b
a
)(
)(
10
11
12
13
14
15
16
17
18
Circulo
Rectangulo
-mRadio : float
-mAncho : float
-mLargo : float
Triangulo
-mA : float
-mB : float
-mC : float
19
Nombre
Crculo
Datos
r = radio
Rectngulo
a = ancho
b = largo
Permetro
rea
b
a
20
a, b, c = lados
s = semipermetro
)(
)(
Figura 3D
Nombre
Cono
rea
Volumen
h = altura
g = generatriz
Datos
r = radio de la base
Cilindro
r = radio de la base
h = altura
h
r
Paraleleppedo
a = ancho
b = largo
c = altura
Tetraedro
a = arista
Pirmide con
una
base
cuadrangular
a = arista de la base
b = arista del
tringulo issceles
ap = apotema
h = altura
PB = permetro de la
base
AB = rea de la base
b
a
a
a
a
a
b ap
a
21
22
Circulo
Rectangulo
#mRadio : float
#mAncho : float
#mLargo : float
Cono
Cilindro
-mAltura : float
-mGeneratriz : float
-mAltura : float
Triangulo
#mA : float
#mB : float
#mC : float
Paralelepipedo
-mAltura : float
Tetraedro
Piramide
-mAltura : float
-mApotema : float
5.5. Polimorfismo
El polimorfismo es la facultad de asumir muchas formas, refirindose a la facultad
de que con una sola sentencia se puede llamar a muchas funciones de objetos
diferentes heredados. El polimorfismo tiene la capacidad de llamar a una
variedad de funciones virtuales utilizando exactamente el mismo medio de acceso.
El polimorfismo se utiliza en una estructura de rbol de clases, en donde cada
clase derivada dentro de este rbol puede recibir uno o ms mensajes con el mismo
nombre, ya que cuando un objeto de una clase derivada dentro de este rbol recibe un
mensaje, este objeto determina la aplicacin particular del mensaje que resulta
apropiada. Esta caracterstica permite a cada objeto de una clase derivada responder a
un formato de mensaje de manera apropiada segn su definicin.
23
Nombre
Crculo
Datos
r = radio
Rectngulo
a = ancho
b = largo
Tringulo
a, b, c = lados
s = semipermetro
Permetro
rea
b
a
)(
)(
24
25
Punto2D
#mX : float
#mY : float
Circulo
Rectangulo
-mRadio : float
-mAncho : float
-mLargo : float
Triangulo
-mA : float
-mB : float
-mC : float
26
27
28
29
30
31
32
33
34
35
36
37
38
=
=
=
=
ObjPunto2D;
ObjCirculo;
ObjRectangulo;
ObjTriangulo;
}
// Funcin que permite leer los datos de los objetos a travs
39
40
Nota:
5.8. Interfaces
Una interface es una coleccin de mtodos abstractos y propiedades. Todos los
mtodos que se declaran en una interface son siempre pblicos o public. Las
interfaces tambin pueden contener datos definidos como public final static. Para
usar una interface, una clase debe especificar que va a implementar la interface
utilizando la palabra reservada implements y la clase debe definir cada mtodo con el
nmero de parmetros y el tipo de retorno especificaco en la definicin de la interface.
La principal diferencia entre interface y abstract es que una interface proporciona un
mecanismo de encapsulacin de los protocolos de los mtodos sin forzar al usuario a
utilizar la herencia.
En el Ejercicio 5.4 se va a mostrar el uso de las interfaces, de acuerdo a lo que se
plantea en ese ejercicio.
Ejercicio 5.4: Escribir un programa que permita representar las siguientes figuras
geomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando interfaces.
Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular el
permetro y el rea de esas figuras, de acuerdo a las siguientes frmulas matemticas:
Figura
Nombre
Crculo
Datos
r = radio
Permetro
rea
41
a = ancho
b = largo
Tringulo
a, b, c = lados
s = semipermetro
b
a
)(
)(
42
Figura
#mX : float
#mY : float
+Area() : float
+Perimetro() : float
+Calcular() : void
+getTipo() : string
+LeerDatos() : void
+ImprimirDatos() : void
Circulo
Rectangulo
-mRadio : float
-mAncho : float
-mLargo : float
Triangulo
-mA : float
-mB : float
-mC : float
43
44
45
46
47
48
49
50
51
52
53
54
55
56
=
=
=
=
ObjPunto2D;
ObjCirculo;
ObjRectangulo;
ObjTriangulo;
}
// Funcin que permite leer los datos de los objetos a travs
// de un arreglo de objetos.
public static void LeerDatos()
{
for(int i = 0; i < ArrayDeFiguras.length; i++)
{
System.out.printf(ArrayDeFiguras[i].getTipo());
ArrayDeFiguras[i].LeerDatos();
System.out.printf("\n");
}
}
// Funcin que permite imprimir los datos de los objetos a travs
// de un arreglo de objetos.
public static void ImprimirDatosYCalculos()
{
for(int i = 0; i < ArrayDeFiguras.length; i++)
{
ArrayDeFiguras[i].ImprimirDatos();
ArrayDeFiguras[i].Calcular();
System.out.printf("\n");
}
}
}
En las tablas 5.4.7 y 5.4.8 se muestra una de las salidas de este programa en el cual
justamente se ha utilizado un arreglo de objetos para instanciar o crear los objetos que
representan a las diferentes figuras geomtricas. Lo importante de este ejercicio es ver
como trabaja una interface con mtodos pblicos abstractos y ver como una clase base
y sus clases derivadas implementan las funciones de la interface.
57
5.9. Resumen
La herencia permite a una clase derivada (tambin llamada clase hija o subclase)
heredar datos y mtodos de una clase base (tambin llamada clase padre o
superclase). De este modo, se puede solamente escribir una vez el cdigo general
compartido y se lo puede pasar a lo largo de las clases especficas a travs de la
herencia, permitiendo de esta manera ahorrar trabajo y reutilizar cdigo. Adems,
desde el punto de vista de la programacin orientada a objetos en Java, la herencia
permite modelar el mundo real utilizando objetos y relaciones entre ellos con cdigo de
programacin.
58
PROBLEMA
Escribir un programa que permita simular en modo texto el movimiento de una flota de
naves espaciales dentro de un plano cartesiano de 200x150, para un juego en 2D,
donde la posicin de la nave espacial se genera aleatoriamente a travs de un punto
en 2D y luego se lo plasma en un Vector 2D que permite representar el movimiento de
una nave en el plano. La flota de naves espaciales estar compuesta por tres naves de
combate y dos naves bombarderas, cada una con su respectivo capitn, adems se
registrarn los datos con respecto a la posicin de la nave, la velocidad con la que
volar sobre un plano cartesiano, el nivel de combustible, el nivel de dao y
dependiendo del tipo de nave, el nmero de misiles y el nmero de bombas. Utilizar
para este caso de estudio composicin, herencia y polimorfismo.
A.) Consideraciones del problema:
59
5.10.2.
Claramente, se puede ver que las entradas del problema son los datos referentes a la
descripcin de la nave espacial, como son el nombre y apellido del capitn de la nave,
la posicin de la nave, la velocidad con la que volar sobre un plano cartesiano, el nivel
de combustible, el nivel de dao y dependiendo del tipo de nave, el nmero de misiles
y el nmero de bombas. Todos estos datos se organizarn en diferentes clases que
representarn a los diferentes entes que componen este juego para 2D.
5.10.3.
Descripcin
Nombre del capitn de la nave.
Apellido del capitn de la nave.
Vector 2D, que representa la posicin de una nave en el plano
cartesiano.
Vector 2D, que representa la velocidad de una nave en el plano
cartesiano. La velocidad se asumir que es uniformemente
constante y su valor no vara.
Representa al valor del nivel del combustible entre 0 y 100%.
Representa al valor del nivel de dao hecho a una nave y vara
entre 0 y 3.
Representa al nmero de misiles que puede llevar la nave de
combate.
Representa al nmero de bombas que puede cargar una nave
bombardera.
Descripcin
Punto en 2D, que representa a la posicin aleatoria de la nave en
las coordenadas x e y.
Representa al valor de la coordenada de x de un Vector 2D y de
60
mY
DISEO
Una vez que se conocen las entradas y salidas del problema, se debern disear las
clases que componen la aplicacin, para lo cual se presenta en la Figura 5.7, el
diagrama de clases utilizando composicin y herencia con notacin UML.
NaveEspacial
1
*
Punto2D
#mNombre : string
#mApellido : string
#mPosicion : Vector2D
#mVelocidad : Vector2D
#mNivelCombustible : int
#mNivelDanio : int
#mPunto2DAleatorio : Punto2D
-mX : float
-mY : float
-mPunto2D[] : int
-mNumeroAleatorio : NumeroAleatorio
1
*
*
Vector2D
-mX : float
-mY : float
NaveDeCombate
NaveBombardera
-mNumeroMisiles : int
-mNumeroBombas : int
NumeroAleatorio
-mLimiteInferior : int
-mLimiteSuperior : int
-mNumeroAleatorio : int
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
=
=
=
=
=
ObjNaveDeCombate1;
ObjNaveDeCombate2;
ObjNaveDeCombate3;
ObjNaveBombardera1;
ObjNaveBombardera2;
}
// Funcin que permite leer los datos de los objetos a travs
// de un arreglo de objetos.
public static void LeerDatos()
{
79
80
81
82
public
protected
private
Ninguna de las anteriores
5.11.2.
a. Saltar la inicializacin.
b. Utilizar una lista de inicializacin de datos miembros, precedidad por la palabra
clave super.
c. Inicializar los datos miembros directamente en el cuerpo de la funcin.
d. Inicializar los datos miembros en el cuerpo de la funcin, despus de la llamada
al constructor.
e. Ninguna de las anteriores
5.11.3. Cul es la jerarqua de clases en cdigo de la siguiente figura?
Avion
AvionDeCombate
AvionDeCaza
a.
public
public
public
public
public
public
public
AvionBombardero
AvionComercial
AvionDePasajeros
AvionDeCarga
83
public
public
public
public
public
public
public
c.
public
public
public
public
public
public
public
d.
public
public
public
public
public
public
public
a. Verdadero.
b. Falso.
5.11.6. Cul clase debera probablemente ser abstracta?
a.
b.
c.
d.
e.
F16.
F22.
F18.
AvionDeCaza.
Ninguna de las anteriores
84
a. Verdadero.
b. Falso.
85
5.12.3.
5.12.4.
86
87
88