Está en la página 1de 27

Ejemplo de Herencia en Java

Ac tenemos el ejemplo bsico de herencia en Java. En este caso la clase Ciudadano hereda
desde la clase Persona, para tomar funcionalidad y extenderla.
class Humano {
protected String nombre;
protected String apellido;
public Humano(String nombre,String apellido) {
this.nombre = nombre;
this.apellido = apellido;
}
public String nombreCompleto() {
return this.apellido + ", " + this.nombre;
}
public String identificacion() {
return this.nombreCompleto();
}
}
class Ciudadano extends Humano {
protected String documento;
public Ciudadano(String nombre,String apellido, String documento) {
super(nombre,apellido);
this.documento = documento;
}
public String identificacion() {
return super.identificacion() + ", documento: " + this.documento;
}
}
public class Herencia {
public static void main (String args[]) {
Humano a = new Humano("Emilio","Rosso");
Ciudadano b = new Ciudadano("Emilio","Rosso","3052454545");
Humano [] arregloDeHumanos;
arregloDeHumanos.push(a);
arregloDeHumanos.push(b);
identificarPolimorfico(arregloDeHumanos);
}
public static void identificarPolimorfico(Humano [] arregloDeHumanos)
{
for(int i = 0; i < arregloDeHumanos.length ; i++) {
System.out.println("Identificando: " +
arregloDeHumanos[i].identificacion());
}
}
}

http://www.it.uc3m.es/java/gitt/units/oo-herencia/guides/6/guide_es.html
Herencia. Las clases

Figure

Triangle

La clase Figure representa una figura genrica que se


materializar posteriormente en una especfica (Triangle,Square,
etc.). En Java, esto lo representamos mediante las clases
abstractas que se declaran mediante la palabra
reservada abstract.
Nota
Una clase abstracta es la que declara uno o ms mtodos
abstractos cuya implementacin se realiza en las clases
derivadas. Repasa la teora si no recuerdas este concepto.
El primer ejercicio de la prctica consiste en definir la siguiente
clase abstracta Figure, que representa una figura genrica:
public abstract class Figure {
/** Name of the figure */
String name;
/** Constructor of the figure with a name */
public Figure(String name) {
}
/** Calculates the area of a figure */
abstract public double area();
/** Indicates if the figure is regular or not */
abstract public boolean isRegular();
}

Comienza descargando el siguiente cdigo

Figure.java.

Nota
Observa que se han declarado dos mtodos abstractos que se
implementarn en las clases derivadas correspondientes.
Constructores de la clase

Figure.

1. Programa el constructor de la clase.

Cuestion
qu sentido tiene implementar el constructor de una clase
abstracta?
La subclase

Triangle.

La clase Triangle ahora deriva de Figure y tienes que modificarla


para que refleje dichos cambios. Para ello, parte de la
clase Triangle que puedes encontrar en el siguiente
enlace Triangle.java y realiza los siguientes cambios:
Nota
Necesitars tener acceso a la clase Point para poder compilar la
clase Triangle. Puedes descargarla del siguiente enlace Point.java.
1. Declara la clase

Triangle

de la siguiente forma:

public class Triangle extends Figure

2. Modifica los constructores para que en la primera lnea


llamen al constructor de la clase base Figuremediante la
referencia super.
3. Implementa los mtodos que se especifican a
continuacin:
o El mtodo area() que permite calcular el area del
tringulo. El prototipo del mtodo se muestra a
continuacin:
o
o
}

public double area() {


/* complete */

El area del trangulo se calcula segn la siguiente


frmula:
Area = ( base X altura ) / 2
Pista 1
Usa el mtodo distance(Point anotherPoint) de la clase
los vrtices del tringulo.

Point

con

Pista 2
Para calcular la altura de un tringulo cualquiera es
necesario aplicar trigonometra: aqu puedes
aproximar como si fuera un
tringulo issceles o equilatero y suponer que la
proyeccin del vrtice opuesto es el punto medio de
la base.
o

El mtodo isRegular() que permite saber si un tringulo


es regular. El prototipo del mtodo se muestra a
continuacin:
o
o
}

public boolean isRegular() {


/* complete */

El mtodo debe devolver true si la longitud de todos los


lados del tringulo es la misma.
Pista
Solo necesitas comparar la longitud de los tres lados del
tringulo.
o

El mtodo toString() que permite obtener una


representacin en modo texto del objeto. El prototipo
del mtodo se muestra a continuacin:
o
o
}

public String toString() {


/* complete */

El mtodo devuelve una cadena de caracteres con los


valores del del tringulo segn un determinado
formato. El formato de salida de la cadena de
caracteres del mtodo es el siguiente (los valores
mostrados son slo ejemplos):
TRIANGLE [NAME=triangle1] [NON REGULAR] : VERTEXES (1.0,
1.0),(3.0, 1.0),(2.0, 2.0)

Por favor, recuerda que lo que se muestra es la cadena


de salida particularizada con valores ejemplo de los
atributos de la clase para que simplemente

compruebes el formato de salida. En el mtodo no


tienes que usar estos valores sino que tienes que
trabajar con los atributos directamente.
Pista 1
Usa el mtodo

toString()

de los vertices del tringulo.

Pista 2
Recuerda que el operador "+", aplicado a cadenas de
texto, permite concatenarlas.
El mtodo

main

de la clase

Triangle

Ahora debes crear un mtodo para probar el cdigo anterior.


Crea el mtodo main en la clase Triangle que haga lo siguiente:
1. Crear tres puntos.
2. Crear un tringulo a partir de los puntos anteriores.
3. Imprimir por pantalla una cadena descriptiva con los
valores del tringulo.
4. Por ltimo, imprime el valor del area del tringulo.
Herencia. La clase

Square.

La clase Square hereda tambin de la clase


siguiente aspecto:

Figure

y tiene el

public class Square extends Figure {


/** Square vertexes */
private Point vertex1;
private Point vertex2;
private Point vertex3;
private Point vertex4;
/** Constructor with name and vertexes */
public Square(String name, Point diagonalVertex1, Point
diagonalVertex3) {
}
/** Private method to calculate the vertexes for the other diagonal*/
private void otherDiagonal(Point vertex1, Point vertex3) {
}

/** Method implementation to calculate the area */


public double area() {
return 0;
}
/** Implementation of the abstract method to calculate if the figure
is regular. */
public boolean isRegular() {
return false;
}
/** Returns a representative string of the square. */
public String toString() {
return null;
}
}

Nota 1
Observa que un cuadrado se crea a partir de una de sus
diagonales, por ello el constructor recibe como parmetros los
dos vrtices de dicha diagonal. Para calcular los otros dos
vrtices restantes, has de implementar el mtodo
privado otherDiagonal(Point vertex1, Point vertex3) que calcula y crea los
otros dos vrtices de la segunda diagonal del cuadrado a partir
de los vrtices que le pasas por parmetros. Es decir, crean los
vrticesvertex2 y vertex4 del cuadrado.
Nota 2
Observa tambin que al derivar de una clase abstracta
como Figure, la clase Square est obligada a implementar TODOS
sus mtodos abstractos... cules son?
Los constructores de la clase

Square.

Descarga el esqueleto de la clase Square del siguiente


enlace Square.java y realiza las siguientes tareas para implementa
el constructor de la clase.
1. Implementa primero el siguiente mtodo privado que
permite crear los vrtices de la segunda diagonal a partir
de los dos vrtices de la primera. El prototipo del mtodo
se muestra a continuacin:
2.
3.

private void otherDiagonal(Point vertex1, Point vertex3) {


/* complete */

Ese mtodo crea los dos vrtices de la segunda diagonal del


cuadrado (vertex2 y vertex4) en base a las coordenadas de los
vrtices de la primera diagonal que se le pasa como
parmetros.
Pista
Esta es otra de la simplificaciones que decamos. Para una
solucin correcta, deberas encontrar el vector
perpendicular a la diagonal definida y entonces buscar los
puntos que se encuentran a la distancia adecuada. Pero,
para que no tengas que estas peleando con las
matemticas, te proponemos lo siguiente: simplemente
supn que los lados son paralelos a los ejes, de modo que
la x y la y de los dos vrtices que faltan son simplemente
los de los puntos ya conocidos, pero cruzados entre s.
4. Implementa el constructor de la clase.
Pista
Usa el mtodo que has implementado anteriormente para
calcular los vrtices del cuadrado.
Mtodos auxiliares de la clase

Square.

Implementa los mtodos de


continuacin:

Square

que se especifican a

1. Programa el mtodo area() que permite calcular el rea del


cuadrado. El prototipo de dicho mtodo se muestra a
continuacin:
2.
3.
}

public double area() {


/* complete */

El mtodo permite calcular el rea de un cuadrado de acuerdo


a la siguiente frmula: Area = base X altura
Pista

Usa el mtodo distance(Point


vrtices del cuadrado.

anotherPoint)

de la clase

Point

con los

4. Programa en mtodo isRegular() que permite comprobar si un


cuadrado es una figura regular. El prototipo de dichos
mtodos se muestra a continuacin:
5.
6.
}

public boolean isRegular() {


/* complete */

El mtodo es obvio.
7. Programa en mtodo toString() que permite obtener una
representacin en modo texto del objeto. El prototipo de
dicho mtodo se muestra a continuacin:
8.
9.
}

public String toString() {


/* complete */

El mtodo devuelve una cadena de caracteres con formato


con los valores del cuadrado. El formato de salida de la
cadena de caracteres del mtodo toString() es el siguiente
(los valores son ejemplos):
SQUARE [NAME=cuadrado1] : VERTEXES (3.0, 3.0),(5.0, 3.0),(5.0,
5.0),(3.0, 5.0)

Pista 1
Puedes reutilizar gran parte del mtodo

toString()

del tringulo.

Pista 2
Recuerda que el operador "+", aplicado a cadenas de texto,
permite concatenarlas.
El mtodo

main

de la clase

Square

Ahora debes crear un mtodo para probar el cdigo anterior.


Crea el mtodo main en la clase Square que haga lo siguiente:
1. Crear dos puntos que sern la diagonal de tu figura.
2. Crear un cuadrado a partir de los puntos anteriores.

3. Imprimir por pantalla una cadena descriptiva con los


valores del cuadrado.
4. Por ltimo, imprime el valor del area del cuadrado.
Arrays y polimorfismo. Clculo del area de varias figuras.

La clase FiguresArea, que contiene el array de figuras con el que


trabajaremos en este ejercicio, es la que nos va a permitir
calcular el area total de un conjunto de figuras. Tiene el
siguiente aspecto:
public class FiguresArea {
/** The array of figures */
private Figure figures[] = null;
/** Constructor of the class with a fixed number of figures. */
public FiguresArea(int figuresNumber) {
}
/** Calculates the total area of the array figures. */
public double totalArea() {
return 0.0;
}
/** Adds a new figure in the first empty position of the figures
array. */
public void addFigure (Figure f){
}
/** Prints a list with the array figures. */
public void print() {
}
/** Main Program */
public static void main(String args[]) throws Exception {
}
}

El constructor de la clase inicializa el array con el nmero


mximo de figuras. El mtodo addFigure() permite aadir un
objeto Figure en el primer hueco libre del array. El
mtodo totalArea() es el que ir sumando las areas de las figuras
que contiene el array y devolver la suma total de ellas. El
mtodo print() saca por pantalla dicha area total con algn
mensaje descriptivo de las figuras.

Constructor.

Descarga la clase FiguresArea del siguiente enlace


realiza la siguiente tarea

FiguresArea.java

1. Implementa el constructor de la clase, que inicializa el


array de figuras con el nmero mximo.
Mtodos auxiliares de la clase

FiguresArea.

Implementa los mtodos de


continuacin:

FiguresArea

que se especifican a

1. Programa en mtodo addFigure (Figure f) que permite aadir un


objeto Figure al array. El prototipo de dicho mtodo se
muestra a continuacin:
2.
3.
}

public void addFigure (Figure f) {


/* complete */

El mtodo debe aadir un nuevo objeto


figuras.

Figure

al array de

Recuerda
Recordando de teora, Figure es abstracta y, por consiguiente
no podran existir instancias de dichos objetos. Las
instancias son, en realidad, de las clases derivadas
de Figure, es decir: Triangle, Square.
4. Programa en mtodo totalArea() que permite calcular el area
total de las figuras del array. El prototipo de dichos
mtodos se muestra a continuacin:
5.
6.
}

public double totalArea() {


/* complete */

El mtodo debe calcular el area total de las figuras contenidas


en el array de las figuras. Para ello, recorre el array de las
figuras y va sumando las areas correspondientes de cada
una de ellas..
Pista

Recuerda para qu servan los metodos abstractos de


la hora de implementar el mtodo.

Figure

7. Programa en mtodo print() que permite imprimir el area


total de las figuras. El prototipo de dichos mtodos se
muestra a continuacin:
8.
9.
}

public void print() {


/* complete */

El mtodo imprime por pantalla el resultado del clculo del


area de todas las figuras. Para ello, hace uso del mtodo
anterior que permite calcularla.
Nota
Puedes imprimir tambin de qu figura se trata, para lo cual,
usa los mtodos toString() de cada figura.
Recuerda
El polimorfismo es una consecuencia de aplicar la herencia en
las clases y permite lo que se conoce
comosobreescritura de mtodos por la que un mismo
mtodo puede implementarse en una clase base y
derivada. En tiempo de ejecucin, en funcin del tipo del
objeto, el intrprete de Java invocar al de la clase
correspondiente del tipo del mismo.
El mtodo

main

de la clase

FiguresArea

Crea el programa principal que tiene que realizar lo siguiente:


1. Crear un objeto FiguresArea con dos figuras como mximo.
2. Crear una figura que sea un Triangle. Para ello tendras que
crear previamente los 3 puntos que constituyen los
vrtices del mismo y pasrselos al constructor.
3. Crea una figura que sea un Square. Igualmente, tendrs que
crear previamente los 2 puntos que constituyen la diagonal
del cuadrado y pasarlos a su constructor.

4. Aade el triangulo y el cuadrado al array de figuras


de FiguresArea. Usa el mtodo que has implementado
anteriormente para ello.
5. Imprime el resultado del calculo del area total de las
figuras. Para ello, invoca al mtodo correspondiente de la
clase.

2. Actividades para casa

2.1. Herencia y referencias a clase base


Objetivo

Mediante este ejercicio se pretende que el alumno conozca el


funcionamiento bsico de las referencias a clase base en las
jerarquas de herencia.
Ejercicio

Descargue los siguientes ficheros java


( Position.java, Figure.java, Castle.java, Queen.java ) y analice la
jerarqua de clases y la clase Position utilizadas.
Vamos a manejar una coleccin de elementos figuras. Como la
clase Figure es abstracta no podremos crear instancias de ella, por
lo que la coleccin de elementos estar formada por objetos de
las clases Castle y Queen, indistintamente.
Implemente el cdigo necesario para mantener en la misma
coleccin de forma indiferente a 2 objetos de la clase Queen y a 4
objetos de la clase Castle.
Una vez implementado el cdigo anterior, recorra la coleccin
llamando al mtodo public void whoAmI() para comprobar el
funcionamiento correcto de las referencias a clase base.

Otras cuestiones

Una vez realizado el ejercicio se plantean una serie de


cuestiones para resolver:

Sobre la coleccin de elementos del array a qu mtodos


puede llamarse realmente?
Si la clase Castle implementase el mtodo void castle() podra
llamarse a este mtodo desde una referencia a clase base?
Qu tendramos que hacer para poder utilizar el mtodo
anterior void castle() en un objeto de la clase Castleque es
apuntado por una referencia a la clase Figure?
Qu tendramos que hacer para saber exactamente a que
clase pertenecen cada uno de los objetos apuntados por
una referencia a clase base?

2.2. Ejercicio para practicar con Figuras


En este ejercicio se van a asentar los conceptos de
Programacin Orientada a Objetos (POO) en Java, aplicndolos
a una jerarqua de clases para definir figuras geomtricas.
NOTA IMPORTANTE: Recuerda que es fundamental que vayas
probando el cdigo segn vas implementando cada mtodo,
aunque no se pida explcitamente.
La interfaz

Figure.

En Java, una Interfaz representa las especificaciones que


cumplen todas las clases que lo implementan. Se utilizan
habitualmente para definir el conjunto de mtodos que
queremos asegurarnos que proporcionen dichas clases.
Por ejemplo, la interfaz Comparable representa en Java los
objetos que pueden compararse entre s. Por tanto, define el
mtodo compareTo() que permite comparar dos objetos. Cualquier
clase cuyos objetos se puedan comparar entre s, debera
implementar este mtodo. As se facilita el diseo y la

reutilizacin de cdigo, puesto que siempre sabemos cmo se


llamar el mtodo de comparacin y qu resultado devolver.
Antes de seguir con el resto de apartados, responde a las
siguientes cuestiones:

Qu es una interfaz?
Cmo se implementa en java?
Qu significa que una clase implementa una interfaz?
Cmo se indica en java?

Todas las clases que se definan en este ejercicio deben


proporcionar un conjunto de mtodos bsicos, como calcular el
rea de la figura geomtrica representada. En Java, esto se
implementa definiendo la interfaz que declara todos los mtodos
que obligatoriamente deben implementarse en dichas clases.
Por tanto, todas las clases creadas en este ejercicio, deben
implementar la siguiente interfaz Figure.
La figura geomtrica.

Una clase abstracta es una clase que no puede ser instanciada.


Se indica con el modificador abstract en su declaracin. Una clase
es abstracta cuando tiene "al menos" algn mtodo abstracto.
Es decir, un mtodo que nicamente est declarado, pero no
implementado. Este mtodo tendr que programarse en las
clases hijas. Puesto que no pueden instanciarse objetos, las
clases abstractas tienen sentido como clases de las que heredan
otras.
Recuerda que una clase abstracta puede tener constructores,
aunque no pueden instanciarse objetos de la misma.
1. Programa la clase abstracta GeometricFigure, que almacenar la
informacin comn a todas las figuras geomtricas (por
ejemplo, una etiqueta identificativa) y proporcionar los
mtodos que puedan programarse independientemente de
la forma concreta de la figura. Esta clase debe
implementar la interfaz Figure. Todas las clases que

representen figuras geomtricas heredarn de la


clase GeometricFigure.
Cualquier figura tendr una etiqueta identificativa. Por
tanto debers definir un atributo de tipo String en esta clase
para almacenar dicha etiqueta.
2. Programa un constructor que reciba como parmetro la
etiqueta identificativa de la figura.
3. Programa los mtodos get y set para modificar el atributo
etiqueta. Puesto que estos mtodos no deberan cambiar
su funcionalidad, declralos como final para evitar que las
clases hijas los sobreescriban.
4. Implementa el mtodo printDescription(). Observa que no es un
mtodo abstracto, aunque invoque otros que s lo sean.
Para evitar que las clases hijas puedan modificar el
formato de la descripcin, declralo comofinal.
El mtodo debe imprimir por pantalla una descripcin de la
figura, incluyendo su etiqueta, el tipo de figura y su rea
con el siguiente formato:
Tag: C-5
Figure Type: Square
Area: 25

Recuerda que esta clase debe implementar la interfaz Figure,


por lo que debe proporcionar todos los mtodos definidos
en dicha interfaz que puedan implementarse con la
informacin disponible en la clase:getTag e printDescription. Los
mtodos que no puedan implementarse, no es necesario
incluirlos (Java asume automticamente que son
abstractos), pero debern proporcionarlos las clases hijas.
El rectngulo.

La siguiente clase a implementar representar un rectngulo y,


cmo no, se llamar Rectangle. Esta clase hereda de GeometricFigure e
implementa la interfaz Figure. Para caracterizar el rectngulo se
utilizarn su base y su altura, que asumiremos que son nmeros
enteros.

1. Programa la declaracin de la clase y sus atributos


correspondientes.
2. Programa el constructor y los mtodos accesores (get y
bsicos.
3. Programa los siguientes mtodos de la clase que se
especifican a continuacin:

set

4.
public String getFigureType();
5.
6.
public double area();
7.
public void drawTxt();

El mtodo drawTxt() debe dibujar la figura en la consola de


texto. Por ejemplo, un rectngulo con base 6 y altura 3 se
podra mostrar como:
******
******
******

8. Descarga la clase FiguresTesting, y haz que en su mtodo


main cree una instancia de la clase Rectangle y la muestre en
consola, junto con su descripcin.
9. Contesta a las siguientes cuestiones:
o Indica la diferencia entre una clase y un objeto
o Qu pasos tiene el proceso de instanciar un objeto?
o Cmo se instancia en java un objeto?
RECUERDA: Si una clase implementa una interfaz,
automticamente todas sus clases hijas implementan dicha
interfaz, incluso aunque no se indique explictamente en su
declaracin. Observa que la clase Rectangleimplementa la
interfaz Figure, aunque no lo indiques explcitamente en su
declaracin, porque hereda de una clase que lo
implementa Figura.
El cuadrado.

Un cuadrado es un rectngulo con base y altura iguales. En


Java, podemos crear una clase Square muy fcilmente, mediante
herencia, a partir de la clase Rectangle.

1. Programa la clase Square de tal forma que herede de la


clase Rectangulo del apartado anterior. La clase Squareslo
necesita un constructor que reciba un parmetro (el valor
del lado), y que llame al constructor deRectangle con los
parmetros base y altura iguales.
2. Prueba esta nueva clase aadiendo el cdigo necesario a la
clase FiguresTesting.
3. Observa que gracias a la herencia, pueden invocarse los
mtodos programados en la clase Rectangle sobre un objeto
de tipo Square, sin necesidad de reprogramarlos.
4. Contesta a las siguientes cuestiones:
o En qu consiste la herencia?
o Cmo se indica en java que una clase hereda de
otra?
o Qu mtodos de la clase padre son visibles desde la
clase hija?
o En qu consiste la sobreescritura (overrid) de
mtodos?
o Recuerda que, a diferencia del resto de mtodos, las
clases hijas no heredan automticamente los
constructores de la clase padre, pero pueden
invocarse con ayuda de super().
Referencia a interfaces.

En este apartado debes mejorar la clase FiguresTesting para que


proporcione una interfaz de usuario en modo texto, que permita
al usuario elegir la figura geomtrica que desea pintar, solicite
los parmetros adecuados para cada figura, instancie la clase,
imprima su descripcin y pinte la figura en consola.
Utiliza el siguiente men:
1.2.3.0.-

Create rectangle
Create square
Display figure
Exit

Si el usuario selecciona una de las 2 primeras opciones, debern


pedrsele los datos adecuados. Si selecciona la opcin 3, se
mostrar la descripcin y se dibujar la ltima figura creada.

Debe presentarse el men hasta que el usuario seleccione la


opcin Salir.
Para facilitar la generacin del objeto adecuado a partir de los
datos que introduzca el usuario, conviene que aadas un
mtodo readFigureData() a cada una de las clases programadas. Este
mtodo recibe como parmetro un objeto de tipo BufferedReader, del
cual ir leyendo los datos que introduzca el usuario. Y devuelve
como resultado un objeto de la clase correspondiente
inicializado con los datos introducidos. Declralo como mtodo
esttico.
Contesta a las siguientes cuestiones:

De qu tipo son los objetos instanciados (en las opciones


1 y 2)?
De qu tipo es la variable que los referencia?
Qu mtodos de la clase padre son visibles desde la clase
hija?
Puedes utilizar la misma varible como referencia a las
distintas figuras creadas? Por qu?

2.3. Cifrado
Objetivo

Mediante este ejercicio pretendemos dar una visin de cmo la


orientacin a objetos nos permite reutilizar cdigo siempre que
la utilicemos correctamente.
Ejercicio

Supongamos que sabemos muy poco sobre teora de cifrado de


cadenas de caracteres. Digamos que conocemos de odas varios
algoritmos de cifrado, en su mayora difciles de implementar y
uno, llamado Cesar, basado en una rotacin en caracteres que
es asequible de implementar por nosotros.

El algoritmo de Csar se basa en el orden de los caracteres en el


abecedario. Para cada uno de los caracteres de la cadena de
entrada se le suman N posiciones en el abecedario para
encontrar el caracter por el que sustituir. Por ejemplo, si nos
encontramos con el caracter 'A' y hay que sumar 3 posiciones,
sustituiramos la 'A' por la 'D' al cifrar ese caracter.
Implementa una solucin orientada a objetos que me permita
fcilmente en el futuro cambiar este algoritmo por otro mucho
mejor.
Haz primero una solucin basada en una clase
abstracta Cifrado que representa un algoritmo genrico de cifrado,
con las operaciones bsicas de cifrado y descifrado (por
ejemplo, recibiendo una cadena y devolviendo una cadena), y
luego una clase CifradoCesar que deriva de la primera e implementa
el algoritmo de Csar.
En segundo lugar, implementa una solucin basada en la
definicin de una interfaz Cifrable y una clase CifradoCesarque lo
implementa.

Introduccin
El objetivo general de esta prctica es repasar el uso de la herencia en Java y su aplicacin a arrays
de objetos. La herencia la basaremos en el uso de abstract y extends, con las que crearemos una
clase genrica y varias especficas que deriven de ella. Se implementarn sus mtodos abstractos y
se sobreescribirn otros que permitirn demostrar el polimorfismo a la hora de usar los objetos de la
jerarqua de clases. Por ltimo, usaremos un array de objetos de la anterior jerarqua que permita
demostrar todo lo anterior.
En particular, en esta prctica se va a calcular el area total de un conjunto de figuras que hayamos
creado previamente. Partiremos de la clase Triangulo que ya conocemos de la prctica 1 de repaso y
crearemos una clase genrica Figura que permita abstraernos a la hora de trabajar con cualquier
tipo de figura. Una vez definido el comportamiento deFigura, se derivar nuestra
clase Triangulo de ella y se adaptar convenientemente para que pueda ser considerada como
una Figura. Despus crearemos la clase, Cuadrado, que heredar tambin de Figura, como era de
imaginar.
Una vez creadas todas las figuras, implementaremos una clase que contenga un array de figuras (un
tringulo y un cuadrado, por ejemplo) y calcularemos el area total de ellas aprovechando el
polimorfismo de las clases para calcular el area de cada una.

Ejercicio 1.- Herencia. Las clases Figura y Triangulo


La clase Figura representa una figura genrica que se materializar posteriormente en una
especfica (Triangulo, Cuadrado, etc.). En Java, esto lo representamos mediante las clases
abstractas que se representan mediante la palabra reservada abstract.
Nota: Una clase abstracta es la que declara uno o ms mtodos abstractos cuya implementacin se
realiza en las clases derivadas. Repasa la teora si no recuerdas este concepto.
El primer ejercicio de la prctica consiste en definir la siguiente clase abstracta Figura, que
representa una figura genrica:
public abstract class Figura {
String nombre;
public Figura(String nombre);
abstract public double calculaArea();
abstract public boolean esRegular();
}

Puedes partir del siguiente cdigo Figura.java.


Nota: Observa que se han declarado dos mtodos abstractos que se implementarn en las clases
derivadas correspondientes.

Apartado 1: implementar los constructores de Figura


Implementa el constructor de la clase. El valor por defecto de nombre es "figura". Recuerda que un
atributo puede inicializarse en ms sitios que el constructor.
Piensa en una cosa: qu sentido tiene implementar el constructor de una clase abstracta?

Apartado 2: modificar la clase Triangulo para que herede de Figura


La clase Triangulo ahora deriva de Figura y tienes que modificarla para que refleje dichos cambios.
Para ello, parte de la clase Triangulo de la prctica 1 que puedes encontrar en el siguiente
enlace Triangulo.java y realiza los siguientes cambios:

Declaracin de la clase:
public class Triangulo extends Figura

Constructores: modifica los constructores para que en la primera lnea llamen al


constructor de Figura mediante la referencia super.

Implementa los siguientes mtodos que se especifican a continuacin:


public double calculaArea() {
/* completar */
}

Devuelve el area de un tringulo:


Area = ( base X altura ) / 2
Pista 1: Usa el mtodo calcularDistancia(Punto p) de la clase Punto con los vrtices del
tringulo.
Pista 2: Para calcular la altura de un tringulo cualquiera es necesario aplicar
trigonometra; aqu puedes aproximar como si fuera un tringulo issceles o equilatero y
suponer que la proyeccin del vrtice opuesto es el punto medio de la base.
public boolean esRegular() {
/* completar */
}

Devuelve true si la longitud de todos los lados del tringulo es la misma.


Pista: Solo necesitas comparar la longitud de los tres lados del tringulo.
public String toString() {
/* completar */
}

Devuelve una cadena de caracteres con formato con los valores del tringulo. El formato
de salida de la cadena de caracteres del mtodo toString() es el siguiente:
TRIANGULO [NOMBRE=triangulo1] [NO REGULAR] : VERTICES (1.0,
1.0),(3.0, 1.0),(2.0, 2.0)

Por favor, recuerda que lo que se muestra es la cadena de salida particularizada con
valores ejemplo de los atributos de la clase para que simplemente compruebes el formato
de salida. En el mtodo no tienes que usar estos valores sino que tienes que trabajar con
los atributos directamente.
Pista 1: Usa el mtodo toString() de los vertices del tringulo.
Pista 2: recuerda que el operador "+", aplicado a cadenas de texto, permite concatenarlas.
Nota: Necesitars tener acceso a la clase Punto para poder compilar la clase Triangulo. Puedes
descargarla del siguiente enlace Punto.java.

Apartado 3: el mtodo main de Triangulo.


Ahora debes crear un mtodo para probar el cdigo anterior. Crea el mtodo main en la
clase Triangulo que haga lo siguiente:

1. Crear tres puntos


2. Crear un tringulo a partir de los puntos anteriores.
3. Imprimir por pantalla una cadena descriptiva con los valores del tringulo.
4. Por ltimo, imprime el valor del area del tringulo.

Ejercicio 2.- Herencia. La clase Cuadrado


La clase Cuadrado hereda tambin de la clase Figura y tiene el siguiente aspecto:
public class Cuadrado extends Figura {
private Punto vertice1;
private Punto vertice2;
private Punto vertice3;
private Punto vertice4;
public Cuadrado() {
/* ... */
}
public Cuadrado(Punto diagonalVertice1, Punto diagonalVertice3) {
/* ... */
}
private void calculaOtraDiagonal(Punto vertice1, Punto vertice3) {
/* ... */
}

public double calculaArea() {


/* ... */
}
public boolean esRegular() {
/* ... */
}
public String toString() {
/* ... */
}
}

Nota 1: Observa que un Cuadrado se crea a partir de su diagonal, por ello el constructor recibe
como parmetros los dos vrtices de dicha diagonal. Para calcular los otros dos vrtices restantes,
has de implementar el mtodo privado calculaOtraDiagonal(vertice1, vertice3) que calcula y crea
los otros dos vrtices de la otra diagonal del cuadrado a partir de los vrtices que le pasas por
parmetros. Es decir, crean los vrtices vertice2 y vertice4 del cuadrado.
Nota 2: Observa tambin que al derivar de una clase abstracta como Figura, la clase Cuadrado est
obligada a implementar TODOS sus mtodos abstractos... cules son?

Apartado 1: implementar los constructores de Cuadrado


Descarga el esqueleto de la clase Cuadrado del siguiente enlace Cuadrado.java e implementa el
constructor. Para ello, implementa primero el siguiente mtodo:
private void calculaOtraDiagonal(Punto vertice1, Punto vertice3)

Ese mtodo crea los otros dos puntos que son los vrtices de la otra diagonal del cuadrado
(vertice2 y vertice4) en base a las coordenadas de los puntos de la diagonal que se le pasa como
parmetros.
Pista: has de comprobar antes de crear esos dos puntos si la diagonal que representan los
parmetros vertice1 y vertice3 es vertical u horizontal ya que el clculo del resto de los vrtices
ser ms sencillo. O si lo estimas oportuno, este mtodo tambin puede valer:
1.
2.
3.
4.

se calcula el punto medio (P) de la diagonal ( (x1+x2/2) , (y1,y2/2) )


se calcula el vector director (Vector1) P->V1 (del punto medio a un extremo)
se extrae el vector director ortogonal al anterior y de igual mdulo (Vector2)
v2 = P + Vector2, v4 = P - Vector2;

Apartado 2: implementar el resto de los mtodos de Cuadrado


Ahora implementa el resto de los mtodos de Cuadrado que se especifican a continuacin:
public double calculaArea() {
/* completar */
}

Devuelve el area de un cuadrado:


Area = base X altura
Pista 1: Usa el mtodo calcularDistancia(Punto p) de la clase Punto con los vrtices del cuadrado.
public boolean esRegular() {
/* completar */
}

Es obvio.
public String toString() {
/* completar */
}

Devuelve una cadena descriptiva con valores del cuadrado con un formato concreto:
CUADRADO [NOMBRE=cuadrado1] : VERTICES (3.0, 3.0),(5.0, 3.0),(5.0,
5.0),(3.0, 5.0)

Recuerda que esto slo es un ejemplo, aqu irn los valores propios de los atributos de cada
objeto.
b>Pista 1: Puedes reutilizar gran parte del mtodo toString() del tringulo.
Pista 2: recuerda que el operador "+", aplicado a cadenas de texto, permite concatenarlas.

Apartado 3: el mtodo main de Cuadrado


Ahora debes crear un mtodo para probar el cdigo anterior. Crea el mtodo main en la
clase Cuadrado que haga lo siguiente:

1. Crear dos puntos que sern la diagonal de tu figura.


2. Crear un cuadrado a partir de los puntos anteriores.
3. Imprimir por pantalla una cadena descriptiva con los valores del cuadrado.
4. Por ltimo, imprime el valor del area del cuadrado.

Ejercicio 3.- Arrays. Clculo del area de varias figuras


La clase AreaFiguras, que contiene el array de figuras con el que trabajaremos en este ejercicio, es
la que nos va a permitir calcular el area total de un conjunto de figuras. Tiene el siguiente aspecto:
public class AreaFiguras {
Figura figuras[] = null;
public AreaFiguras( int numFiguras ) {/*....*/}
public void aadeFigura ( Figura f ){/* .... */ }
public double calculaAreaTotal() {/* .... */}
public void imprime() {/* .... */}

public static void main( String args[] ) {/* .... */}


}

El constructor de la clase inicializa el array con el nmero mximo de figuras. El


mtodo aadeFigura permite aadir un objeto Figura en el primer hueco libre del array. El
mtodocalculaAreaTotal es el que ir sumando las areas de las figuras que contiene el array y
devolver la suma total de ellas. El mtodo imprime saca por pantalla dicha area total con algn
mensaje descriptivo de las figuras.

Apartado 1: implementar el constructor


Descarga la clase AreaFiguras del siguiente enlace AreaFiguras.java e implementa el constructor de
la clase, que inicializa el array de figuras con el nmero mximo de figuras.

Apartado 2: implementar el resto de los mtodos de AreaFiguras


Implementa el resto de los mtodos de AreaFiguras que se especifican a continuacin:
public void aadeFigura (Figura f) {
/* completar */
}

Aade un objeto Figura al array. Para ello, recorre el array de figuras y cuando encuentra el primer
hueco libre, asigna la figura en dicha posicin del array.
Recuerda: Recordando de teora, Figura es abstracta y, por consiguiente no podran existir
instancias de dichos objetos. Las instancias son, en realidad, de las clases derivadas de Figura
(Triangulo, Cuadrado).
public double calculaAreaTotal() {
/* completar */
}

Calcula el area total de las figuras contenidas en el array de las figuras. Para ello, recorre el array
de las figuras y va sumando las areas correspondientes de cada una de ellas.
Pista: Recuerda para qu servan los metodos abstractos de Figura a la hora de implementar el
mtodo.
public void imprime() {
/* completar */
}

Imprime por pantalla el resultado del clculo del area de todas las figuras. Para ello, hace uso del
mtodo anterior que permite calcularla.
Nota: Puedes imprimir tambin de qu figura se trata, para lo que puedes usar los
mtodos toString() de cada figura.
Recuerda: El polimorfismo es una consecuencia de aplicar la herencia en las clases ya que permite
lo que se conoce como "sobreescritura" de mtodos por la que un mismo mtodo puede

implementarse en una clase base y derivada. En tiempo de ejecucin, en funcin del tipo del objeto,
el intrprete de Java invocar al de la clase correspondiente del tipo del mismo.

Apartado 3: el mtodo main de AreaFiguras


Crea el programa principal que tiene que realizar lo siguiente:

1. Crear un objeto AreaFiguras con dos figuras como mximo.


2. Crear una figura que sea un triangulo. Para ello tendras que crear previamente los 3
puntos que constituyen los vrtices del mismo y pasrselos al constructor.
3. Crea una figura que sea un cuadrado. Igualmente, tendrs que crear previamente los 2
puntos que constituyen la diagonal del cuadrado y pasarlos a su constructor.
4. Aade el triangulo y el cuadrado al array de figuras de AreaFiguras. Usa el mtodo que has
implementado anteriormente para ello.
5. Imprime el resultado del calculo del area total de las figuras. Para ello, invoca al mtodo
correspondiente de la clase.

Ejercicio 4 (complementario)
Se pretende poder crear los puntos de las figuras pidiendo al usuario que introduzca las coordenadas
de los mismos por teclado. Para ello, actualiza las clases que has implementado en esta prctica
como se indica a continuacin.

Clase Figura
Implementa el mtodo que permita obtener un punto a partir de las lecturas de sus coordenadas del
teclado. La especificacin del mtodo es la siguiente:
public Punto leeVertice(String texto) { /* ... */ }

Lee las coordenadas de un punto del teclado y devuelve un nuevo objeto Punto inicializado con
dichas coordenadas. Para ello, usa el parmetro texto que permite identificar de qu punto se
trata y lee respectivamente las coordenadas x e y del punto. Por ltimo, devuelve un
nuevo Punto creado con dichas coordenadas.
Pista: Revisa el cdigo de las soluciones de las prcticas anteriores de repaso para saber cmo se
leen los valores del teclado.

Clases Triangulo y Cuadrado


Implementa un constructor vaco en cada clase que no tenga parmetros y que invoque al anterior
mtodo para crear los puntos de los vrtices correspondientes.
En el caso de Triangulo, el constructor crea un triangulo pidiendo al usuario las coordenadas de los
puntos de los vrtices del mismo. Para el cuadrado, pide al usuario las coordenadas de los puntos de
los vrtices de la diagonal del mismo.

En la implementacin de ambos mtodos debers hacer uso del mtodo leerVertice de la


clase Figura que acabas de implementar.

Clase AreaFiguras
Modifica el mtodo main para que se comporte de la siguiente manera:

Si el nmero de argumentos es 0, el funcionamiento del programa no se modifica y


funciona de la misma manera
Si el nmero de argumentos es 1, el argumento (args[0]) ser el numero de figuras del
array. El programa deber ir creando cada una a partir de los valores introducidos por
teclado por el usuario.
Nota: Antes de introducirlos, el programa deber preguntar el tipo de figura que se
pretende crear (Triangulo, Cuadrado).
En otro caso, se indicar que el nmero de argumentos es incorrecto.

Por ltimo, se propone que crees una nueva clase de figura y que repitas todo lo que has hecho en
esta prctica para que compruebes cmo puede reutilizarse y extenderse el cdigo que has
implementado.

También podría gustarte