capítulo 5 herencia y polimorfismo - cxvs - versión final corregida
Post on 17-Feb-2018
234 Views
Preview:
TRANSCRIPT
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
1/88
Programacin en Java para Ingenieros
1
CAPTULO 5
HERENCIA YPOLIMORFISMO
Autor: Ing. Csar Villacs Silva
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
2/88
Programacin en Java para Ingenieros
2
5.1. Introduccin
Los lenguajes de programacin orientados a objetos como el Java proporcionanmecanismos para reutilizar cdigo. Los principales beneficios de la reutilizacin delcdigo son el incremento de la productividad y la facilidad del mantenimiento delcdigo. Las funciones, las clases y todos los mecanismos de abstraccin que tienen
estos lenguajes permiten que el cdigo sea reutilizable; mientras que el uso decomentarios en cada funcin y en cada algoritmo de un programa ayuda almantenimiento del cdigo.
En la programacin se generalizan las cosas tal como sucede tambin en lasmatemticas. Los matemticos generalizan entes abstractos que resuelven unproblema siempre de la misma manera. Al resolver un problema con la forma msgeneral, la solucin se aplica a todos las formas especficas con similarescaractersticas. De manera similar, en los lenguajes de programacin orientados aobjetos, el mecanismo de abstraccin de la herencia, permite definir una clasegenrica y compartir todos sus atributos y mtodos con otras clases especficas. Estaes la manera en la que se puede escribir una sola vez un cdigo general compartido, y
luego se lo puede reutilizar en varias clases especficas. El concepto de reutilizar elcdigo a travs de la herencia es el primer tema de este captulo.
Adicionalmente a la generalizacin, se puede tambin trabajar con un conjunto deobjetos de clases especficas a un nivel general. Por ejemplo: si se plantea escribir unprograma para dibujar y pintar, tipo Paint, se necesitan varias clases especficas defiguras geomtricas tales como Linea, Rectangulo, Triangulo, Circulo, Ovalo, Curva,etc. Luego a partir de todas estas figuras, se podra utilizar la herencia y crearatributos y mtodos desde una clase general llamada Figura. Al combinar los objetosde tipo Linea, con los objetos de tipo Rectangulo, con los objetos de tipo Triangulo,con los objetos de tipo Circulo, con los objetos de tipo Ovalo, con los objetos de tipoCurva, etc., dentro de una lista de tipo Figurao en un arreglo de objetos, se habilita ens mismo la funcionalidad de trabajar en un nivel superior con todas estas figuras. Por
lo tanto, se puede controlar con una iteracin sobre todas las figuras la capacidad dedibujarse a s mismas, sin necesidad de considerar a una figura en especial. Por otraparte, es posible generalizar los objetos especficos de tipo Figuracon la clase Figura,y a partir de ellos saber cmo se dibujaran por s mismos, en adicin a la formageneral, con el uso delpolimorfismo.
5.2. Objetivos del Captulo
Revisar los principales conceptos en torno a la herencia y al polimorfismo. Entender como la herencia se aplica en Java en la construccin de programas,
con cdigo eficiente. Entender cmo trabaja el polimorfismo y cmo se lo aplica en Java, en laconstruccin de programas con cdigo eficiente. Aprender cmo crear tipos de datos abstractos e intrefaces en Java. Disear y crear programas en Java utilizando herencia y polimorfismo.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
3/88
Programacin en Java para Ingenieros
3
5.3. Conceptos Bsicos de Herencia
La herencia permite a una clase derivada, tambin conocida como clase hija osubclase, heredar los datos miembro (atributos) y las funciones miembro (mtodos)de una clase base, tambin conocida como clase padreo madreosuperclase.
Los miembros pblicos(public members) de una superclase son accesibles por todoslos mtodos de las clases derivadas en el programa. Los miembros privados(privatemembers) de una superclase solamente son accesibles por los mtodos de lasuperclase. El especificador de acceso protegido (protected) sirve como un nivelintermedio de proteccin entre el especificador de acceso pblico (public) y elprivado (private). Los miembros protegidos de una superclase pueden seraccedidos solamente por mtodos de la superclasey por mtodos de la subclasey por mtodos de otras clases en el mismo paquete (package). Cuando un mtodo dela subclase sobrecarga a un mtodo de la superclase, el mtodo de la superclasepuede ser accedido desde la subclase precediendo al nombre del mtodo de lasuperclase con la palabra clave super seguido por el operador punto (.). Lointeresante en este punto es que si se llama al constructor padre dentro del
constructor de la clase derivada, el cual tiene una serie de parmetros, donde algunosde ellos corresponden a los datos miembros de la clase base, se utiliza la palabra clavesuper, seguida por una lista de parmetros conocida como la lista de inicializacinde datos miembros. En el Ejercicio 5.1 se va a mostrar el uso de clases derivadas, deacuerdo a lo que se plantea en ese ejercicio.
Ejercicio 5.1: Escribir un programa que permita representar las siguientes figurasgeomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando herencia.Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular elpermetro y el rea de esas figuras, de acuerdo a las siguientes frmulas matemticas:
Figura Nombre Datos Permetro rea
r
Crculo r = radio
a
b
Rectngulo a = anchob = largo
ab
c
Tringulo a, b, c = ladoss = semipermetro
( )( )( )
La implementacin de todo este programa se lo realizar en un archivo de proyecto detipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_1, quecontiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene cincoclases las mismas que son: Punto2D, Circulo, Rectangulo, Trianguloy Programa, queson las clases con las cuales se resolvern el presente ejercicio, tal y como lo muestrala Figura 5.1.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
4/88
Programacin en Java para Ingenieros
4
Figura 5.1.ProyectoJavaConsolaPrograma_5_1.
Para resolver este ejercicio, primeramente se va crear una clase lo ms generalposible, con la posibilidad de reutilizar sus atributos, propiedades y mtodos generales
en otras clases especficas, y con lo cual se evita la duplicacin de cdigo. Primero seva a crear la clase Punto2D, la cual es una clase completamente general, y puedecontribuir en la generacin de diferentes figuras geomtricas como el crculo, elrectngulo y el tringulo.
Por lo pronto, se puede decir que la clase Punto2D va a tener la posicin encoordenadas cartesianas de cualquier figura geomtrica en el plano, para lo cual se vaa tener dos atributos:mXde tipofloat, que representa a la coordenada x de un puntoen el plano ymYde tipofloatque representa a la coordenada y de un punto en elplano. Por cada atributo, se tienen dos propiedades que manejan los descriptores deacceso set (colocar) y get (obtener), las cuales son:
a) Para el atributomXse tienen las siguientes propiedades: getXy setX.
b) Para el atributomYse tienen las siguientes propiedades: getYy setY.
Estos atributos se han definido utilizando el especificador de accesoprotected, ya quela clase Punto2Des la clase base de toda la aplicacin.
Se definirn algunos mtodos para la clase Punto2D de acuerdo a las acciones quepuede hacer y que bsicamente sern funciones para poder operar un punto en elplano. La implementacin de esta clase general Punto2D, se presenta a continuacin enla tabla 5.1.1, que es parte de la solucin del ejercicio 5.1.
Tabla 5.1.1:Cdigo de la clase Punto2D del programa.
/** Cdigo del archivo Punto2D.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
5/88
Programacin en Java para Ingenieros
5
public classPunto2D{
// Atributos de la clase.protected floatmX;protected floatmY;
// Mtodos de la clase.
// Constructor sin argumentos.publicPunto2D(){
setX(0); setY(0);}
// Constructor con dos argumentos.publicPunto2D(floatx, floaty){
setX(x); setY(y);
}
// Funcin que obtiene la coordenada 'x' de un punto.public floatgetX(){
return mX;}
// Funcin que inicializa la coordenada 'x' de un punto.public voidsetX(floatx){
this.mX= x;}
// Funcin que obtiene la coordenada 'y' de un punto.public floatgetY(){
return mY;}
// Funcin que inicializa la coordenada 'y' de un punto.public voidsetY(floaty){
this.mY= y;}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Punto\n");}
// Funcin que obtiene las coordenasas 'x' e 'y' de un punto.publicString getCoordenadas(){
return("("+ getX() + ", "+ getY() + ")");
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
6/88
Programacin en Java para Ingenieros
6
}
// Funcin que imprime los datos de un punto.public voidImprimirDatos(){
System.out.printf(getTipo() + getCoordenadas());
}
// Funcin que lee las coordenadas 'x' e 'y' de un punto.public voidLeerDatos(){
String sData = "";
try{
System.out.printf("Ingrese el valor de la coordenada x: ");
InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);
sData = streamInput.readLine();mX= Float.parseFloat (sData);}catch(IOException e){
System.err.println("Error: " + e.getMessage());}
try{
System.out.printf("Ingrese el valor de la coordenada y: ");
InputStreamReader isr = newInputStreamReader(System.in);
BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mY= Float.parseFloat (sData);
}catch(IOException e){
System.err.println("Error: " + e.getMessage());}
}}
Como se puede ver en el cdigo de la tabla 5.1.1, no se necesita incluir ningn atributoadicional como el radio del crculo, la base y la altura del rectngulo, entre otros; ni
tampoco se necesita incluir mtodos para calcular el permetro y el rea de las figurasmencionadas anteriormente. En esta seccin del programa solo se est creando laclase general.
Observe que la palabra claveprotectedha sido utilizada en lugar de la palabra claveprivate. Esto permite que una clase derivada acceda a los datos miembros de la clasebase y adems indica que no hay ninguna restriccin con la clase que fue diseadapara el propsito de la herencia y la derivacin de las clases hijas.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
7/88
Programacin en Java para Ingenieros
7
Una vez que se tiene la clase base, se pueden definir las clases derivadas las mismasque son: a) clase Circulo; b) clase Rectangulo; c) clase Triangulo. Para crear la
jerarqua de clases en cdigo se escribe lo siguiente, donde el detalle de cada clase seomite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public classPunto2D {}
public classCirculo extendsPunto2D {}public classRectangulo extendsPunto2D {}public classTriangulo extendsPunto2D {}
Como se puede ver en el cdigo anterior, se utiliza la palabra clave extendsque indicaque tanto la clase Circulo, como la clase Rectanguloy la clase Trianguloson clasesderivadas (subclases o hijas) de la clase Punto2D (superclase o padre) o se dicetambin que existe una herencia pblica desde la clase Punto2D, hacia sus clases hijas.
El atributo que se tiene en la clase Circulo es tan solo el radio representado por eldato miembro mRadio que es de tipo float. Para este atributo, se tienen dospropiedades que manejan los descriptores de acceso set (colocar) y get (obtener), lascuales son: getRadioy setRadio.
Se definirn algunos mtodos para la clase Circulo de acuerdo a las acciones quepuede hacer y que bsicamente sern funciones para poder representar y operar uncrculo en el plano.
Como se discuti previamente en este captulo, se puede invocar a un mtodo de lasuperclase desde la clase derivada utilizando la palabra reservada superseguida por elnombre del mtodo que se quiere invocar; cuando no se invoca a ningn mtodo enparticular, automticamente se llama al constructor de la superclase, con una lista deparmetros.
Una clase derivada est hecha por dos partes: la parte de la clase padre y la parteespecfica de la clase hija. Consecuentemente, se puede invocar al constructor de laclase padre para construir la parte que le corresponde a esa clase, e incluso se puedeenviar una lista de parmetros para que los inicialice, lo cual se conoce como lista deinicializacin de miembros.
Adicionalmente, cuando un objeto es inicializado, la memoria de sus miembros seconstruye primero (o son inicializados) antes de que el cdigo del constructor de laclase sea ejecutado. Se puede explcitamente especificar la manera en que un datomiembro podra ser construido en la lista de inicializacin de miembros.
La implementacin de la clase derivada Circulo, se presenta a continuacin en la tabla5.1.2, que es parte de la solucin del ejercicio 5.1.
Tabla 5.1.2:Cdigo de la clase Crculo del programa.
/** Cdigo del archivo Circulo.java*/
packagePaqueteFigurasGeometricas;
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
8/88
Programacin en Java para Ingenieros
8
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public classCirculo extendsPunto2D{
// Atributos de la clase.private floatmRadio;
// Mtodos de la clase.
// Constructor sin argumentos.publicCirculo(){
// Llamada al constructor con dos parmetros de la clase padre.super(0.0f, 0.0f);setRadio(0.0f);
}
// Constructor con tres argumentos.publicCirculo(floatx, floaty, floatr){
// Llamada al constructor con dos parmetros de la clase padre.super(x, y);setRadio(r);
}
// Funcin que obtiene el radio de un crculo.public floatgetRadio(){
returnmRadio;}
// Funcin que inicializa el radio de un crculo.public voidsetRadio(floatradio){
// Se verifica que el radio del crculo no sea negativo.if(radio >= 0){
this.mRadio= radio;}else{
this.mRadio= 0.0f;}
}
// Funcin que calcula el rea de un crculo.public floatArea(){
return((float)Math.PI* mRadio* mRadio);}
// Funcin que calcula el permetro de un crculo.public floatPerimetro()
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
9/88
Programacin en Java para Ingenieros
9
{return(2 * (float)Math.PI* mRadio);
}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un crculo e imprime esos resultados.
public voidCalcular(){System.out.printf("\n"+ "Permetro= " + Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.public StringgetTipo(){
return("Crculo\n");}
// Funcin que obtiene los datos de un crculo y los imprime por
// pantalla en forma de cadena.public StringgetDatosCirculo(){
return("Centro = "+ super.getCoordenadas() +"; Radio = "+ getRadio());
}
// Funcin que imprime los datos de un crculo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosCirculo());}
// Funcin que lee las coordenadas 'x' e 'y' y el 'radio' de un crculo.public voidLeerDatos(){
StringsData = "";super.LeerDatos();try{
System.out.printf("Ingrese el valor del radio: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mRadio= Float.parseFloat(sData);
}
catch(IOException e){System.err.println("Error: "+ e.getMessage());
}}
}
La implementacin de la clase derivada Rectangulo, se presenta a continuacin en latabla 5.1.3, que es parte de la solucin del ejercicio 5.1.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
10/88
Programacin en Java para Ingenieros
10
Los atributos que se tienen en la clase Rectangulo son el ancho y el largorepresentados por los datos miembrosmAnchoymLargoque son de tipofloat. Por cadaatributo, se tiene dos propiedades que manejan los descriptores de acceso set(colocar) y get (obtener), las cuales son:
a) Para el atributo mAncho se tienen las siguientes propiedades: getAncho y
setAncho.b) Para el atributo mLargo se tienen las siguientes propiedades: getLargo y
setLargo.
Esta clase tambin posee un grupo de mtodos que de manera similar a la claseCirculo, realizan diferentes operaciones y donde se necesite se puede invocar a lasfunciones de la clase padre utilizando la palabra reservada super.
Se definirn algunos mtodos para la clase Rectangulode acuerdo a las acciones quepuede hacer y que bsicamente sern funciones para poder representar y operar unrectngulo en el plano.
Tabla 5.1.3:Cdigo de la clase Rectngulo del programa./** Cdigo del archivo Rectangulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public classRectangulo extendsPunto2D
{ // Atributos de la clase.private floatmAncho;private floatmLargo;
// Mtodos de la clase.
// Constructor sin argumentos.publicRectangulo(){
super(0.0f, 0.0f);setAncho(0.0f);setLargo(0.0f);
}
// Constructor con dos argumentos.publicRectangulo(floatx, floaty, floatancho, floatlargo){
super(x, y);setAncho(ancho);setLargo(largo);
}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
11/88
Programacin en Java para Ingenieros
11
// Funcin que obtiene la base de un rectngulo.public floatgetAncho(){
returnmAncho;}
// Funcin que inicializa la base de un rectngulo.public voidsetAncho(floatancho){
// Se verifica que el ancho del rectngulo no sea negativo.if(ancho >= 0){
this.mAncho= ancho;}else{
this.mAncho= 0.0f;}
}
// Funcin que obtiene la altura de un rectngulo.public floatgetLargo(){
returnmLargo;}
// Funcin que inicializa la altura de un rectngulo.public voidsetLargo(floatlargo){
// Se verifica que el largo del rectngulo no sea negativo.if(largo >= 0){
this.mLargo= largo;}else{
this.mLargo= 0.0f;}
}
// Funcin que calcula el rea de un rectngulo.public floatArea(){
return(mAncho* mLargo);}
// Funcin que calcula el permetro de un rectngulo.public floatPerimetro(){
return(2 * mAncho+ 2 * mLargo);}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un rectngulo e imprime esos resultados.public voidCalcular()
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
12/88
Programacin en Java para Ingenieros
12
{System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.
publicString getTipo(){return("Rectngulo\n");
}
// Funcin que obtiene los datos de un rectngulo y los imprime por// pantalla en forma de cadena.publicString getDatosRectangulo(){
return("Vrtice = "+ super.getCoordenadas() +"; Ancho = "+ getAncho() +"; Largo = "+ getLargo());
}
// Funcin que imprime los datos de un rectngulo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosRectangulo());}
// Funcin que lee las coordenadas 'x' e 'y', el ancho y el largo// de un rectngulo.public voidLeerDatos(){
String sData = "";
super.LeerDatos();
try{
System.out.printf("Ingrese el valor del ancho: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mAncho= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());
}
try{
System.out.printf("Ingrese el valor del largo: ");InputStreamReader isr = new InputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mLargo = Float.parseFloat(sData);
}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
13/88
Programacin en Java para Ingenieros
13
catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
}}
La implementacin de la clase derivada Triangulo, se presenta a continuacin en latabla 5.1.4, que es parte de la solucin del ejercicio 5.1.
Los atributos que se tienen en la clase Triangulo son los tres lados que tiene untringulo representados por los datos miembrosmA,mBymCque son de tipofloat. Porcada atributo, se tiene dos propiedades que manejan los descriptores de acceso set(colocar) y get (obtener), las cuales son:
a) Para el atributomAse tienen las siguientes propiedades: getAy setA.b) Para el atributomBse tienen las siguientes propiedades: getBy setB.c) Para el atributomCse tienen las siguientes propiedades: getCy setC.
Esta clase tambin posee un grupo de mtodos que de manera similar a la claseRectangulo, realizan diferentes operaciones y donde se necesite se puede invocar a lasfunciones de la clase padre utilizando la palabra reservada super.
Se definirn algunos mtodos para la clase Triangulode acuerdo a las acciones quepuede hacer y que bsicamente sern funciones para poder representar y operar untringulo en el plano.
Tabla 5.1.4:Cdigo de la clase Tringulo del programa.
/** Cdigo del archivo Triangulo.java
*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public classTriangulo extendsPunto2D{
// Atributos de la clase.privatefloatmA;privatefloatmB;
privatefloatmC;
// Mtodos de la clase.
// Constructor sin argumentos.publicTriangulo(){
super(0.0f, 0.0f);setA(0.0f);setB(0.0f);
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
14/88
Programacin en Java para Ingenieros
14
setC(0.0f);}
// Constructor con cuatro argumentos.publicTriangulo(floatx, floaty, floata, floatb, floatc){
super(x, y);setA(a);setB(b);setC(c);
}
// Funcin que obtiene el lado 'a' del tringulo.public floatgetA(){
returnmA;}
// Funcin que inicializa el lado 'a' del tringulo.
public voidsetA(floata){// Se verifica que el lado 'a' del tringulo no sea negativo.if(a >= 0){
this.mA= a;}else{
this.mA= 0.0f;}
}
// Funcin que obtiene el lado 'b' del tringulo.publicfloatgetB(){
returnmB;}
// Funcin que inicializa el lado 'b' del tringulo.public voidsetB(floatb){
// Se verifica que el lado 'b' del tringulo no sea negativo.if(b >= 0){
this.mB= b;
}else{
this.mB= 0.0f;}
}
// Funcin que obtiene el lado 'c' del tringulo.public floatgetC(){
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
15/88
Programacin en Java para Ingenieros
15
returnmC;}
// Funcin que inicializa el lado 'c' del tringulo.public voidsetC(floatc){
// Se verifica que el lado 'c' del tringulo no sea negativo.if(c >= 0){
this.mC= c;}else{
this.mC= 0.0f;}
}
// Funcin que calcula el rea de un tringulo, con la frmula de Hern.public floatArea()
{ floats = Semiperimetro(mA, mB, mC);return((float)Math.sqrt(s * (s - mA) * (s - mB) * (s - mC)));
}
// Funcin que calcula el semipermetro de un tringulo.private static floatSemiperimetro(floata, floatb, floatc){
return((a + b + c) / 2);}
// Funcin que calcula el permetro de un tringulo.public floatPerimetro()
{ return(2 * Semiperimetro(mA, mB, mC));}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un tringulo e imprime esos resultados.public voidCalcular(){
// Se verifica la existencia de un tringulo, comprobando que la suma// de cualquiera de los dos lados de un tringulo sea mayor que el// tercer lado.if((mA+ mB> mC) && (mA+ mC> mB) && (mB+ mC> mA)){
System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");}else{
System.out.printf("El tringulo no existe...\n");}
}
// Funcin que obtiene el tipo de figura geomtrica.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
16/88
Programacin en Java para Ingenieros
16
publicString getTipo(){
return("Tringulo\n");}
// Funcin que obtiene los datos de un tringulo y los imprime por
// pantalla en forma de cadena.publicString getDatosTriangulo(){
return("Vrtice = "+ super.getCoordenadas() +"; Lado 'a' = "+ getA() +"; Lado 'b' = "+ getB() +"; Lado 'c' = "+ getC());
}
// Funcin que imprime los datos de un tringulo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosTriangulo());
}
// Funcin sin parmetros que lee las coordenadas 'x' e 'y',// los lados 'a', 'b' y 'c' de un tringulo cualquiera.public voidLeerDatos(){
String sData = "";
super.LeerDatos();
try{
System.out.printf("Ingrese el valor del lado 'a': ");
InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mA= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
try{
System.out.printf("Ingrese el valor del lado 'b': ");
InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mB= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
17/88
Programacin en Java para Ingenieros
17
try{
System.out.printf("Ingrese el valor del lado 'c': ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();
mC= Float.parseFloat(sData);}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
}
// Funcin con parmetros que inicializa las coordenadas 'x' e 'y',// los lados 'a', 'b' y 'c' de un tringulo cualquiera, utilizando// los parmetros 'a', 'b' y 'c' que son asignados a los datos miembro// de la clase.public voidsetLadosTriangulo(floata, floatb, floatc)
{ mA= a; mB= b; mC= c;}
}
La implementacin de la clase Programa, se presenta a continuacin en la tabla 5.1.5,que es la parte final de la solucin del ejercicio 5.1.
a) Parte 1:Como se puede ver en la primera parte del programa principal voidmainse crean los objetos que representan a las diferentes figuras geomtricascomo son: ObjPunto2D, ObjCirculo, ObjRectanguloy ObjTriangulo, para lo cualse utilizan los constructores por defecto o sin argumentos de cada una de lasclases que se instancian como son: Punto2D, Circulo, Rectanguloy Triangulo,
respectivamente.b) Parte 2:En la segunda parte del programa principal simplemente se imprime
un grupo de mensajes para indicar que se va a trabajar con figuras geomticas.c) Parte 3:En la tercera parte del programa principal se realiza toda la lectura de
datos con los objetos que representan a las cuatro figuras geomtricas encuestin que son: Punto, Crculo, Rectngulo y Tringulo. Cada objeto invoca asu mtodo de lectura que se llama LeerDatos, el cual se encarga de leer losdatos que le corresponde de acuerdo a la figura geomtrica que representa.
d) Parte 4: En la cuarta parte del programa principal se realizan los clculosmatemticos y la impresin de resultados. Aqu cada objeto invoca a dosmtodos: a) Mtodo Calcular, que se encarga de realizar los clculosmatemticos del rea y permetro de la figura a la que representa; b) Mtodo
ImprimirDatos, que se encarga de realizar la impresin de los resultadosobtenidos.
Tabla 5.1.5:Cdigo de la clase Programa de la aplicacin.
/** Cdigo del archivo Programa.java*/
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
18/88
Programacin en Java para Ingenieros
18
packagePaqueteFigurasGeometricas;
public classPrograma{
public static voidmain(String[] args){
// Parte 1: Creacin de objetos, utilizando constructores.Punto2D ObjPunto2D = newPunto2D();Circulo ObjCirculo = newCirculo();Rectangulo ObjRectangulo = newRectangulo();Triangulo ObjTriangulo = newTriangulo();
// Parte 2: Impresin de mensajes de informacin.System.out.printf("Figuras Geomtricas\n");System.out.printf("==================\n\n");
// Parte 3: Lectura de datos.System.out.printf(ObjPunto2D.getTipo());ObjPunto2D.LeerDatos();
System.out.printf("\n");System.out.printf(ObjCirculo.getTipo());ObjCirculo.LeerDatos();System.out.printf("\n");System.out.printf(ObjRectangulo.getTipo());ObjRectangulo.LeerDatos();System.out.printf("\n");System.out.printf(ObjTriangulo.getTipo());ObjTriangulo.LeerDatos();System.out.printf("\n\n");
// Parte 4: Clculos e impresin de resultados.ObjPunto2D.ImprimirDatos();
System.out.printf("\n\n");ObjCirculo.ImprimirDatos();ObjCirculo.Calcular();System.out.printf("\n");ObjRectangulo.ImprimirDatos();ObjRectangulo.Calcular();System.out.printf("\n");ObjTriangulo.ImprimirDatos();ObjTriangulo.Calcular();System.out.printf("\n");
}}
Adicionalmente al cdigo del programa con todas sus clases, en la Figura 5.2, semuestra el diagrama de clases de la aplicacin con notacin UML (Lenguaje deModelamiento Unificado Unified Modeling Language).
En las tablas 5.1.6 y 5.1.7 se muestra una de las salidas de este programa en el cualjustamente se ha instanciado algunos objetos los cuales invocan algunos mtodos. Loimportante de este ejercicio es ver como las clases Circulo, Rectangulo y Triangulopueden llamar a los mtodos de la clase Punto2D, utilizando herencia.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
19/88
Programacin en Java para Ingenieros
19
#mX : float
#mY : float
Punto2D
-mRadio : float
Circulo
-mAncho : float
-mLargo : float
Rectangulo
-mA : float
-mB : float
-mC : float
Triangulo
Figura 5.2.Diagrama de clases del Ejercicio 5.1.
Como se pueden ver los beneficios de la herencia son muchos, ya que si en esteejercicio no se hubiese utilizado herencia se habra tenido duplicado todos los datos ymtodos con sus implementaciones contenidas tanto en la clase Punto2D como en elresto de clases; sin embargo, con la herencia se puede evitar la duplicidad de datos alutilizar clases derivadas.
Tabla 5.1.6:Salida del programa.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
20/88
Programacin en Java para Ingenieros
20
Tabla 5.1.7:Salida del programa.
5.4. Herencia Repetitiva
En la seccin anterior se utiliz herencia en una aplicacin de generacin simple, esdecir, padre e hijo. Naturalmente en este punto se puede plantear la interrogante deque si se puede crear relaciones ms complejas, tales como abuelo, padre e hijo. Dehecho, se puede crear jerarquas de herencia tan largas como se requiera y no hay unlmite impuesto.
A continuacin se plantea el Ejercicio 5.2 y algunas pautas para resolverlo y se lo dejaal programador para que lo concluya, donde se muestra el uso de herencia repetitiva.
Ejercicio 5.2: Escribir un programa que permita representar las siguientes figurasgeomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, d) cono, e) cilindro, f)paraleleppedo, g) tetraedro y h) pirmide, utilizando herencia repetitiva.Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular elpermetro, el rea y el volumen de esas figuras, segn corresponda, de acuerdo a lassiguientes frmulas matemticas:
Figura 2D Nombre Datos Permetro rea
r
Crculo r = radio
a
b
Rectngulo a = anchob = largo
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
21/88
Programacin en Java para Ingenieros
21
ab
c
Tringulo a, b, c = ladoss = semipermetro
( )( )( )
Figura 3D Nombre Datos rea Volumen
r
hg
Cono r = radio de la base h = alturag = generatriz
h
r
Cilindro r = radio de la base h = altura
a
b
c
Paraleleppedo a = anchob = largoc = altura
( )
a
a a
a
a
a
Tetraedro a = arista
aph
a
a
b b
Pirmide conuna basecuadrangular
a = arista de la baseb = arista deltringulo isscelesap= apotemah = alturaPB= permetro de labaseAB= rea de la base
La implementacin de todo este programa se lo realizar enun archivo de proyecto detipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_2, quecontiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene diezclases las mismas que son: Punto3D, Circulo, Rectangulo, Triangulo, Cilindro, Cono,Paraleleppedo, Tetraedro, Piramidey Programa, que son las clases con las cuales seresolvern el presente ejercicio, tal y como lo muestra la Figura 5.3.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
22/88
Programacin en Java para Ingenieros
22
Figura 5.3.ProyectoJavaConsolaPrograma_5_2.
El diagrama de clases de esta aplicacin se muestra en la Figura 5.4 con notacin UML.En este diagrama se puede ver que la aplicacin est compuesta por una clase abueloque es la clase Punto3Dy luego hay tres clases padres que son: Circulo, RectanguloyTriangulo, las cuales tienen a su vez sus propias clases hijas. Las clases Cono yCilindroson clases derivadas o hijas de la clase Circulo; la clase Paralelepipedoesuna clase hija de la clase Rectangulo; y las clases Tetraedro y Piramide son clasesderivadas o hijas de la clase Triangulo.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase seomite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public classPunto3D {}
public classCirculo extendsPunto3D {}public classCono extendsCirculo {}public classCilindro extendsCirculo {}
public classRectangulo extendsPunto3D {}public classParalelepipedo extendsRectangulo {}
public classTriangulo extendsPunto3D {}public classTetraedro extendsTriangulo {}public classPiramide extends Triangulo {}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
23/88
Programacin en Java para Ingenieros
23
#mX : float
#mY : float
#mZ : float
Punto3D
#mRadio : float
Circulo
#mAncho : float
#mLargo : float
Rectangulo
#mA : float
#mB : float
#mC : float
Triangulo
-mAltura : float
-mGeneratriz : float
Cono
-mAltura : float
Cilindro
-mAltura : float
Paralelepipedo
-mAltura : float
-mApotema : float
PiramideTetraedro
Figura 5.4.Diagrama de clases del Ejercicio 5.2.
5.5. Polimorfismo
Elpolimorfismoes la facultad de asumir muchas formas, refirindose a la facultadde que con una sola sentencia se puede llamar a muchas funciones de objetosdiferentes heredados. El polimorfismo tiene la capacidad de llamar a unavariedad de funciones virtualesutilizando exactamente el mismo medio de acceso.El polimorfismo se utiliza en una estructura de rbol de clases, en donde cadaclase derivada dentro de este rbol puede recibir uno o ms mensajes con el mismonombre, ya que cuando un objeto de una clase derivada dentro de este rbol recibe unmensaje, este objeto determina la aplicacin particular del mensaje que resultaapropiada. Esta caracterstica permite a cada objeto de una clase derivada responder aun formato de mensaje de manera apropiada segn su definicin.
5.6. Funciones Abstractas o Virtuales
Cuando la clase base y sus clases derivadas tienen una funcin con el mismo nombre yse desea llamar a una funcin de una clase especfica mediante la clase base, elcompilador no puede decidir cul funcin se llamar, ya que la clase base puede serutilizada para acceder a las funciones de las clases derivadas y el compilador no puedecomparar el tipo del objeto, por eso se define una funcin abstracta o virtualla cuales invocada por la clase base, de acuerdo a la clase derivada a la que pertenece.Cuando una clase contiene una funcin virtual, sta consta en una tabla virtual(vtable o virtual table) manejada por el compilador, la cual internamente es un arreglode punteros con todas las direcciones de sus funciones virtuales.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
24/88
Programacin en Java para Ingenieros
24
La funcin abstracta o virtuales una funcin miembro pblica o protegida de unaclase base que puede ser redefinida en cada una de las clases derivadas de sta, y unavez redefinidas las funciones miembro en cada una de las clases derivadas, pueden seraccedidas utilizando una tabla virtual manejada por la clase base. La funcinabstracta o virtual se declara en la clase base y precediendo a su declaracin lapalabra clave abstract.
5.7. Clases Abstractas o Virtuales
Una clase abstracta o virtuales una clase que contiene funciones virtuales puras.Una funcin virtual pura es una funcin virtual que es declarada en la clase base (laclase abstracta) pero no es implementada en la clase base. Esto es responsabilidad delas clases derivadas al sobrecargarse las funciones abstractas o virtuales yproporcionan una implementacin para ellas.
Hay casos en los cuales es til definir clases en las cuales el programador nuncaintenta instanciar ningn objeto. Tales clases se pueden definir como abstractas o
virtuales, porque son utilizadas como superclases en situaciones de herencia, quenormalmente se refieren a ellas como superclases abstractas, donde ningn objeto dela superclases puede ser instanciado. Una clase abstracta o virtualse declara comola clase base de la aplicacin y precediendo a su declaracin la palabra clave abstract.
En el Ejercicio 5.3 se va a mostrar el uso del polimorfismo, funciones abstractas yclases abstractas, de acuerdo a lo que se plantea en ese ejercicio.
Ejercicio 5.3: Escribir un programa que permita representar las siguientes figurasgeomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando herencia,polimorfismo, funciones abstractas y clases abstractas. Adicionalmente ubicar a cadafigura en una coordenada cartesiana y luego calcular el permetro y el rea de esasfiguras, de acuerdo a las siguientes frmulas matemticas:
Figura Nombre Datos Permetro rea
r
Crculo r = radio
a
b
Rectngulo a = anchob = largo
ab
c
Tringulo a, b, c = lados
s = semipermetro
( )( )( )
La implementacin de todo este programa se lo realizar en un archivo de proyecto detipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_3, quecontiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene seis
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
25/88
Programacin en Java para Ingenieros
25
clases las mismas que son: Figura, Punto2D, Circulo, Rectangulo, Triangulo yPrograma, que son las clases con las cuales se resolvern el presente ejercicio, tal ycomo lo muestra la Figura 5.4.
Figura 5.4.ProyectoJavaConsolaPrograma_5_3.
El diagrama de clases de esta aplicacin se muestra en la Figura 5.5 con notacin UML.En este diagrama se puede ver que la aplicacin est compuesta por una clase abueloque viene a ser una clase abstracta y la base para el resto de clases, la cual es la claseFigura y luego hay una clase padre que es Punto2D, la cual tiene tres clases hijas:Circulo, Rectanguloy Triangulo.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase seomite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
public abstract class Figura {}
public classPunto2D extendsFigura {}
public classCirculo extendsPunto2D {}public classRectangulo extendsPunto2D {}public classTriangulo extendsPunto2D {}
Para resolver este ejercicio, primeramente se va crear una clase abstracta o virtualllamada Figurade la cual se deriva la clase Punto2Dy de la cual a su vez se derivan elresto de clases que son Circulo, Rectanguloy Triangulo.
La clase Figuracontiene la implentacin de los mtodosArea, Perimetroy Calcular, yestas implementaciones son heredables, por lo que pueden ser usadas por lassubclases. Esta clase tambin proporciona tres mtodos abstractos que son getTipo,LeerDatos e ImprimirDatos, los cuales indican que sern implementados en cadasubclase pero no en la superclase.
La implementacin de la clase Figura, se presenta a continuacin en la tabla 5.3.1,que es parte de la solucin del ejercicio 5.3.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
26/88
Programacin en Java para Ingenieros
26
#mX : float
#mY : float
Punto2D
-mRadio : float
Circulo
-mAncho : float-mLargo : float
Rectangulo
-mA : float-mB : float
-mC : float
Triangulo
+Area() : float
+Perimetro() : float
+Calcular() : void
+abstract getTipo() : string
+abstract LeerDatos() : void+abstract ImprimirDatos() : void
Figura
Figura 5.5.Diagrama de clases del Ejercicio 5.3.
Tabla 5.3.1:Cdigo de la clase Figura del programa.
/** Cdigo del archivo Figura.java*/
packagePaqueteFigurasGeometricas;
public abstract classFigura{
public floatArea(){ return0.0f; }public floatPerimetro(){ return0.0f; }public voidCalcular(){ System.out.printf("\n"+ "Operaciones y clculos sin definir"+ "\n"); };public abstractString getTipo();public abstract voidLeerDatos();public abstract voidImprimirDatos();
}
La implementacin de la clase derivada Punto2D, se presenta a continuacin en la tabla5.3.2, que es parte de la solucin del ejercicio 5.3.
Esta clase posee un grupo de atributos y mtodos que pueden ser heredables yutilizados por las clases derivadas de Punto2D, as como tambin se pueden definir lasfunciones abstractas o virtuales de la clase base que es la clase Figura, tanto en estaclase como en las clases derivadas de Punto2D.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
27/88
Programacin en Java para Ingenieros
27
Tabla 5.3.2:Cdigo de la clase Punto2D del programa.
/** Cdigo del archivo Punto2D.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public classPunto2D extendsFigura{
// Atributos de la clase.protected floatmX;protected floatmY;
// Mtodos de la clase.
// Constructor sin argumentos.publicPunto2D(){
setX(0); setY(0);}
// Constructor con dos argumentos.publicPunto2D(floatx, floaty){
setX(x); setY(y);}
// Funcin que obtiene la coordenada 'x' de un punto.publicfloat getX(){
returnmX;}
// Funcin que inicializa la coordenada 'x' de un punto.public voidsetX(floatx){
this.mX= x;}
// Funcin que obtiene la coordenada 'y' de un punto.
public floatgetY(){returnmY;
}
// Funcin que inicializa la coordenada 'y' de un punto.public voidsetY(floaty){
this.mY= y;}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
28/88
Programacin en Java para Ingenieros
28
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Punto\n");}
// Funcin que obtiene las coordenasas 'x' e 'y' de un punto.publicString getCoordenadas(){
return("("+ getX() + ", "+ getY() + ")");}
// Funcin que imprime los datos de un punto.public voidImprimirDatos(){
System.out.printf(getTipo() + getCoordenadas());}
// Funcin que lee las coordenadas 'x' e 'y' de un punto.public voidLeerDatos(){
String sData = "";
try{
System.out.printf("Ingrese el valor de la coordenada x: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mX= Float.parseFloat(sData);
}
catch(IOException e){System.err.println("Error: "+ e.getMessage());
}
try{
System.out.printf("Ingrese el valor de la coordenada y: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mY= Float.parseFloat(sData);
}
catch(IOException e){System.err.println("Error: "+ e.getMessage());
}}
}
La implementacin de la clase derivada Circulo, se presenta a continuacin en la tabla5.3.3, que es parte de la solucin del ejercicio 5.3.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
29/88
Programacin en Java para Ingenieros
29
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a laclase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y endonde se necesite se puede invocar a las funciones de la clase padre utilizando lapalabra reservada supery finalmente se puede implementar todas las funciones de laclase abstracta.
Tabla 5.3.3:Cdigo de la clase Circulo del programa.
/** Cdigo del archivo Circulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public final classCirculo extendsPunto2D
{// Atributos de la clase.private floatmRadio;
// Mtodos de la clase.
// Constructor sin argumentos.publicCirculo(){
super(0.0f, 0.0f);setRadio(0.0f);
}
// Constructor con tres argumentos.publicCirculo(floatx, floaty, floatr){
super(x, y);setRadio(r);
}
// Funcin que obtiene el radio de un crculo.public floatgetRadio(){
returnmRadio;}
// Funcin que inicializa el radio de un crculo.public voidsetRadio(floatradio){
// Se verifica que el radio del crculo no sea negativo.if(radio >= 0){
this.mRadio= radio;}else
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
30/88
Programacin en Java para Ingenieros
30
{this.mRadio= 0.0f;
}}
// Funcin que calcula el rea de un crculo.
public floatArea(){return((float)Math.PI* mRadio* mRadio);
}
// Funcin que calcula el permetro de un crculo.public floatPerimetro(){
return(2 * (float)Math.PI* mRadio);}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un crculo e imprime esos resultados.
public voidCalcular(){System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Crculo\n");}
// Funcin que obtiene los datos de un crculo y los imprime por
// pantalla en forma de cadena.publicString getDatosCirculo(){
return("Centro = "+ super.getCoordenadas() +"; Radio = "+ getRadio());
}
// Funcin que imprime los datos de un crculo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosCirculo());}
// Funcin que lee las coordenadas 'x' e 'y' y el 'radio' de un crculo.public voidLeerDatos(){
String sData = "";super.LeerDatos();try{
System.out.printf("Ingrese el valor del radio: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
31/88
Programacin en Java para Ingenieros
31
sData = streamInput.readLine();mRadio= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());
}}}
La implementacin de la clase derivada Rectangulo, se presenta a continuacin en latabla 5.3.4, que es parte de la solucin del ejercicio 5.3.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a laclase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y endonde se necesite se puede invocar a las funciones de la clase padre utilizando lapalabra reservada supery finalmente se puede implementar todas las funciones de laclase abstracta.
Tabla 5.3.4:Cdigo de la clase Rectangulo del programa.
/** Cdigo del archivo Rectangulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public final classRectangulo extendsPunto2D
{// Atributos de la clase.private floatmAncho;private floatmLargo;
// Mtodos de la clase.
// Constructor sin argumentos.publicRectangulo(){
super(0.0f, 0.0f);setAncho(0.0f);setLargo(0.0f);
}
// Constructor con dos argumentos.publicRectangulo(floatx, floaty, floatancho, floatlargo){
super(x, y);setAncho(ancho);setLargo(largo);
}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
32/88
Programacin en Java para Ingenieros
32
// Funcin que obtiene la base de un rectngulo.public floatgetAncho(){
returnmAncho;}
// Funcin que inicializa la base de un rectngulo.public voidsetAncho(floatancho){
// Se verifica que el ancho del rectngulo no sea negativo.if(ancho >= 0){
this.mAncho= ancho;}else{
this.mAncho= 0.0f;}
}
// Funcin que obtiene la altura de un rectngulo.public floatgetLargo(){
returnmLargo;}
// Funcin que inicializa la altura de un rectngulo.public voidsetLargo(floatlargo){
// Se verifica que el largo del rectngulo no sea negativo.if(largo >= 0)
{ this.mLargo= largo;}else{
this.mLargo= 0.0f;}
}
// Funcin que calcula el rea de un rectngulo.public floatArea(){
return(mAncho* mLargo);
}
// Funcin que calcula el permetro de un rectngulo.public floatPerimetro(){
return(2 * mAncho+ 2 * mLargo);}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un rectngulo e imprime esos resultados.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
33/88
Programacin en Java para Ingenieros
33
public voidCalcular(){
System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Rectngulo\n");}
// Funcin que obtiene los datos de un rectngulo y los imprime por// pantalla en forma de cadena.publicString getDatosRectangulo(){
return("Vrtice = "+ super.getCoordenadas() +"; Ancho = "+ getAncho() +"; Largo = "+ getLargo());
}
// Funcin que imprime los datos de un rectngulo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosRectangulo());}
// Funcin que lee las coordenadas 'x' e 'y', el ancho y el largo// de un rectngulo.public voidLeerDatos(){
String sData = "";
super.LeerDatos();
try{
System.out.printf("Ingrese el valor del ancho: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mAncho= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
try{
System.out.printf("Ingrese el valor del largo: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mLargo= Float.parseFloat(sData);
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
34/88
Programacin en Java para Ingenieros
34
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
}
}
La implementacin de la clase derivada Triangulo, se presenta a continuacin en latabla 5.3.5, que es parte de la solucin del ejercicio 5.3.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a laclase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y endonde se necesite se puede invocar a las funciones de la clase padre utilizando lapalabra reservada supery finalmente se puede implementar todas las funciones de laclase abstracta.
Tabla 5.3.5:Cdigo de la clase Triangulo del programa.
/** Cdigo del archivo Triangulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public final classTriangulo extendsPunto2D{
// Atributos de la clase.
private floatmA;private floatmB;private floatmC;
// Mtodos de la clase.
// Constructor sin argumentos.publicTriangulo(){
super(0.0f, 0.0f);setA(0.0f);setB(0.0f);setC(0.0f);
}
// Constructor con cuatro argumentos.publicTriangulo(floatx, floaty, floata, floatb, floatc){
super(x, y);setA(a);setB(b);setC(c);
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
35/88
Programacin en Java para Ingenieros
35
}
// Funcin que obtiene el lado 'a' del tringulo.public floatgetA(){
returnmA;
}
// Funcin que inicializa el lado 'a' del tringulo.public voidsetA(floata){
// Se verifica que el lado 'a' del tringulo no sea negativo.if(a >= 0){
this.mA= a;}else{
this.mA= 0.0f;
}}
// Funcin que obtiene el lado 'b' del tringulo.public floatgetB(){
returnmB;}
// Funcin que inicializa el lado 'b' del tringulo.public voidsetB(floatb){
// Se verifica que el lado 'b' del tringulo no sea negativo.
if(b >= 0){this.mB= b;
}else{
this.mB= 0.0f;}
}
// Funcin que obtiene el lado 'c' del tringulo.public floatgetC(){
returnmC;}
// Funcin que inicializa el lado 'c' del tringulo.public voidsetC(float c){
// Se verifica que el lado 'c' del tringulo no sea negativo.if(c >= 0){
this.mC= c;
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
36/88
Programacin en Java para Ingenieros
36
}else{
this.mC= 0.0f;}
}
// Funcin que calcula el rea de un tringulo, con la frmula de Hern.public floatArea(){
floats = Semiperimetro(mA, mB, mC);return((float)Math.sqrt(s * (s - mA) * (s - mB) * (s - mC)));
}
// Funcin que calcula el semipermetro de un tringulo.private static floatSemiperimetro(floata, floatb, floatc){
return((a + b + c) / 2);}
// Funcin que calcula el permetro de un tringulo.public floatPerimetro(){
return(2 * Semiperimetro(mA, mB, mC));}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un tringulo e imprime esos resultados.public voidCalcular(){
// Se verifica la existencia de un tringulo, comprobando que la suma// de cualquiera de los dos lados de un tringulo sea mayor que el
// tercer lado.if((mA+ mB> mC) && (mA+ mC> mB) && (mB+ mC> mA)){
System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}else{
System.out.printf("El tringulo no existe...\n");}
}
// Funcin que obtiene el tipo de figura geomtrica.
publicString getTipo(){return("Tringulo\n");
}
// Funcin que obtiene los datos de un tringulo y los imprime por// pantalla en forma de cadena.publicString getDatosTriangulo(){
return("Vrtice = "+ super.getCoordenadas() +
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
37/88
Programacin en Java para Ingenieros
37
"; Lado 'a' = "+ getA() +"; Lado 'b' = "+ getB() +"; Lado 'c' = "+ getC());
}
// Funcin que imprime los datos de un tringulo.
public voidImprimirDatos(){System.out.printf(getTipo() + getDatosTriangulo());
}
// Funcin sin parmetros que lee las coordenadas 'x' e 'y',// los lados 'a', 'b' y 'c' de un tringulo cualquiera.public voidLeerDatos(){
String sData = "";
super.LeerDatos();
try{System.out.printf("Ingrese el valor del lado 'a': ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mA= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
try{System.out.printf("Ingrese el valor del lado 'b': ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mB= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
try{System.out.printf("Ingrese el valor del lado 'c': ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mC= Float.parseFloat(sData);
}catch(IOException e){
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
38/88
Programacin en Java para Ingenieros
38
System.err.println("Error: "+ e.getMessage());}
}
// Funcin con parmetros que inicializa las coordenadas 'x' e 'y',// los lados 'a', 'b' y 'c' de un tringulo cualquiera, utilizando
// los parmetros 'a', 'b' y 'c' que son asignados a los datos miembro// de la clase.public voidsetLadosTriangulo(floata, floatb, floatc){
mA= a; mB= b; mC= c;}
}
La implementacin de la clase Programa, se presenta a continuacin en la tabla 5.3.6,que es la parte final de la solucin del ejercicio 5.3.
a) Parte 1:Como se puede ver en la primera parte de la clase Programa, en laseccin de atributos o datos miembro de clase, se declaran los objetos que
representan a las diferentes figuras geomtricas como son: ObjPunto2D,ObjCirculo, ObjRectangulo y ObjTriangulo. Adems se declara un arreglo deobjetos de tipo Figura, llamadoArrayDeFiguras,donde se almacenarn luegotodos los objetos que representan a las figuras geomtricas.
b) Parte 2:En la segunda parte de la clase Programa, en la seccin del programaprincipal principal void main simplemente se imprime un grupo demensajes para indicar que se va a trabajar con figuras geomticas.
c) Parte 3:En la tercera parte de la clase Programa, en la seccin del programaprincipal principal void mainse llama a la funcin esttica Inicializar, lacual se encarga de crear e inicializar los objetos que representan a las figurasgeomtricas, los cuales son: ObjPunto2D, ObjCirculo, ObjRectangulo yObjTriangulo. Adems se crea y se inicializa un arreglo de objetos de tipo
Figura de tamao cuatro, llamadoArrayDeFiguras, donde en cada casillero delarreglo se almacena una de las figuras geomtricas antes indicadas utilizandocada uno de los objetos que representan a dichas figuras.
d) Parte 4:En la cuarta parte de la clase Programa, en la seccin del programaprincipal principal void main se llama a la funcin estticaLeerDatos, lacual utiliza un bucle para obtener el tipo de figura y leer los datoscorrespondientes a cada figura geomtrica, utilizando el arreglo de objetos detipo Figura, llamado ArrayDeFiguras, invoca a dos mtodos: a) MtodogetTipo, que se encarga de obtener el tipo de la figura geomtrica a la cualrepresenta; b) MtodoLeerDatos, que se encarga de leer los datos que lecorresponde de acuerdo a la figura geomtrica que representa. En esteapartado se utiliza el polimorfismo para asumir la forma de la figuracorrespondiente.
e) Parte 5:En la quinta parte de la clase Programa, en la seccin del programaprincipal principal void main se llama a la funcin estticaImprimirDatosYCalculos, donde se realizan los clculos matemticos y laimpresin de resultados. Aqu el arreglo de objetos de tipoFigura, llamado
ArrayDeFiguras, invoca a dos mtodos: a) MtodoCalcular, que se encarga derealizar los clculos matemticos del rea y permetro de la figura a la querepresenta; b) MtodoImprimirDatos, que se encarga de realizar la impresinde los resultados obtenidos. En este apartado tambin se utiliza el polimorfismopara asumir la forma de la figura correspondiente.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
39/88
Programacin en Java para Ingenieros
39
Tabla 5.3.6:Cdigo de la clase Programa de la aplicacin.
/** Cdigo del archivo Programa.java*/
packagePaqueteFigurasGeometricas;
public classPrograma{
// Parte 1: Declaracin de objetos.private staticPunto2D ObjPunto2D;private staticCirculo ObjCirculo;private staticRectangulo ObjRectangulo;private staticTriangulo ObjTriangulo;private staticFigura ArrayDeFiguras[];
public static voidmain(String[] args){
// Parte 2: Impresin de mensajes de informacin.System.out.printf("Figuras Geomticas\n");System.out.printf("==================\n\n");
// Parte 3: Inicializacin de objetos.// Llamada a la funcin Inicializar.Inicializar();
// Parte 4: Lectura de datos.// Llamada a la funcin LeerDatos.LeerDatos();System.out.printf("\n");
// Parte 5: Clculos e impresin de resultados.// Llamada a la funcin ImprimirDatosYCalculos.ImprimirDatosYCalculos();
}
// Funcin que permite crear e incializar objetos y un arreglo// de objetos que contiene a todo el resto de objetos.public static voidInicializar(){
ObjPunto2D= newPunto2D();ObjCirculo= newCirculo();ObjRectangulo= newRectangulo();ObjTriangulo= newTriangulo();
ArrayDeFiguras= newFigura[4];
ArrayDeFiguras[0] = ObjPunto2D;ArrayDeFiguras[1] = ObjCirculo;ArrayDeFiguras[2] = ObjRectangulo;ArrayDeFiguras[3] = ObjTriangulo;
}
// Funcin que permite leer los datos de los objetos a travs
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
40/88
Programacin en Java para Ingenieros
40
// de un arreglo de objetos.public static voidLeerDatos(){
for(inti = 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 voidImprimirDatosYCalculos(){
for(inti = 0; i < ArrayDeFiguras.length; i++){
ArrayDeFiguras[i].ImprimirDatos();ArrayDeFiguras[i].Calcular();
System.out.printf("\n");}}
}
En las tablas 5.3.7 y 5.3.8 se muestra una de las salidas de este programa en el cualjustamente se ha utilizado un arreglo de objetos para instanciar o crear los objetos querepresentan a las diferentes figuras geomtricas. Lo interesante de este ejercicio esver como trabaja una clase abstracta con funciones abstractas y ver como las clasesderivadas implementan las funciones de una clase abstracta.
Tabla 5.3.7:Salida del programa.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
41/88
Programacin en Java para Ingenieros
41
Tabla 5.3.8:Salida del programa.
Nota: En este ejemplo presentado, la herencia no cumple la misma semntica, yaque lo ideal bubiese sido que la clase Figura estese compuesta de un objetode la clase Punto2D, y por motivos didcticos se procedi de esa manera.
5.8. Interfaces
Una interfacees una coleccin de mtodos abstractos y propiedades. Todos losmtodos que se declaran en una interface son siempre pblicos o public. Lasinterfaces tambin pueden contener datosdefinidos comopublic final static. Para
usar una interface, una clase debe especificar que va a implementar la interfaceutilizando la palabra reservada implementsy la clase debe definir cada mtodo con elnmero de parmetros y el tipo de retorno especificaco en la definicin de la interface.
La principal diferencia entre interfacey abstractes que una interface proporciona unmecanismo de encapsulacin de los protocolos de los mtodos sin forzar al usuario autilizar la herencia.
En el Ejercicio 5.4 se va a mostrar el uso de las interfaces, de acuerdo a lo que seplantea en ese ejercicio.
Ejercicio 5.4: Escribir un programa que permita representar las siguientes figurasgeomtricas: a) punto, b) crculo, c) rectngulo, d) tringulo, utilizando interfaces.
Adicionalmente ubicar a cada figura en una coordenada cartesiana y luego calcular elpermetro y el rea de esas figuras, de acuerdo a las siguientes frmulas matemticas:
Figura Nombre Datos Permetro rea
r
Crculo r = radio
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
42/88
Programacin en Java para Ingenieros
42
a
b
Rectngulo a = anchob = largo
ab
c
Tringulo a, b, c = ladoss = semipermetro
( )( )( )
La implementacin de todo este programa se lo realizar en un archivo de proyecto detipo Java Application (Aplicacin de Java) llamado JavaConsolaPrograma_5_4, quecontiene el paquete llamado PaqueteFigurasGeometricas y que a su vez tiene unainterface llamada Figura y cinco clases las mismas que son: Punto2D, Circulo,Rectangulo, Trianguloy Programa, que son las clases con las cuales se resolvern elpresente ejercicio, tal y como lo muestra la Figura 5.4.
Figura 5.4.ProyectoJavaConsolaPrograma_5_4.
El diagrama de clases de esta aplicacin se muestra en la Figura 5.6 con notacin UML.En este diagrama se puede ver que la aplicacin est compuesta por una interfacellamada Figura, la cual se implementa en la clase Punto2D y que a su vez tiene tresclases hijas: Circulo, Rectangulo y Triangulo; las mismas que tambin puedenacceder a la interface Figura.
La jerarqua de clases en cdigo es la siguiente, donde el detalle de cada clase seomite brevemente para mostrarlo luego en el desarrollo de esta aplicacin:
interface Figura {}
public classPunto2D implementsFigura {}
public classCirculo extendsPunto2D {}public classRectangulo extendsPunto2D {}public classTriangulo extendsPunto2D {}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
43/88
Programacin en Java para Ingenieros
43
+Area() : float
+Perimetro() : float
+Calcular() : void
+getTipo() : string+LeerDatos() : void
+ImprimirDatos() : void
#mX : float
#mY : float
Punto2D
-mRadio : float
Circulo
-mAncho : float
-mLargo : float
Rectangulo
-mA : float
-mB : float
-mC : float
Triangulo
Figura
Figura 5.6.Diagrama de clases del Ejercicio 5.4.
Para resolver este ejercicio, primeramente se va a crear una interface llamada Figura,la cual se va a implementar en la clase padre Punto2Dy de la cual a su vez se derivanel resto de clases que son Circulo, Rectanguloy Triangulo.
La interface Figura contiene la declaracin de los mtodosArea, Perimetro, getTipo,LeerDatose ImprimirDatosy Calcular. Estos mtodos pueden ser implementados tantoen la clase Punto2Dcomo en sus clases hijas: Circulo, Rectanguloy Triangulo.
La implementacin de la interface Figura, se presenta a continuacin en la tabla 5.4.1,que es parte de la solucin del ejercicio 5.4.
Tabla 5.4.1:Cdigo de la interface Figura del programa.
/** Cdigo del archivo Figura.java*/
packagePaqueteFigurasGeometricas;
interfaceFigura{
public floatArea();public floatPerimetro();public voidCalcular();
publicString getTipo();public voidLeerDatos();public voidImprimirDatos();
}
La implementacin de la clase padre Punto2D, se presenta a continuacin en la tabla5.4.2, que es parte de la solucin del ejercicio 5.4.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
44/88
Programacin en Java para Ingenieros
44
Esta clase posee un grupo de atributos y mtodos que pueden ser heredables yutilizados por las clases derivadas de Punto2D, as como tambin se puedenimplementar los mtodos de la interface Figura, tanto en esta clase como en las clasesderivadas de Punto2D.
Tabla 5.4.2:Cdigo de la clase Punto2D del programa.
/** Cdigo del archivo Punto2D.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public classPunto2D implementsFigura{
// Atributos de la clase.protected floatmX;protected floatmY;
// Mtodos de la clase.
// Constructor sin argumentos.publicPunto2D(){
setX(0); setY(0);}
// Constructor con dos argumentos.
publicPunto2D(floatx, floaty){
setX(x); setY(y);}
// Funcin que obtiene la coordenada 'x' de un punto.publicfloat getX(){
returnmX;}
// Funcin que inicializa la coordenada 'x' de un punto.public voidsetX(floatx)
{this.mX= x;
}
// Funcin que obtiene la coordenada 'y' de un punto.public floatgetY(){
returnmY;}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
45/88
Programacin en Java para Ingenieros
45
// Funcin que inicializa la coordenada 'y' de un punto.public voidsetY(floaty){
this.mY= y;}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Punto\n");}
// Funcin que obtiene las coordenasas 'x' e 'y' de un punto.publicString getCoordenadas(){
return("("+ getX() + ", "+ getY() + ")");}
// Funcin que imprime los datos de un punto.public voidImprimirDatos(){
System.out.printf(getTipo() + getCoordenadas());}
// Funcin que lee las coordenadas 'x' e 'y' de un punto.public voidLeerDatos(){
String sData = "";
try{
System.out.printf("Ingrese el valor de la coordenada x: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mX= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
try{
System.out.printf("Ingrese el valor de la coordenada y: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mY= Float.parseFloat(sData);
}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
46/88
Programacin en Java para Ingenieros
46
}
// Funcin que retorna un valor arbitrario de cero.public floatArea(){ return0.0f; }
// Funcin que retorna un valor arbitrario de cero.public floatPerimetro(){ return0.0f; }
// Funcin que imprime un mensaje por defecto.public voidCalcular(){ System.out.printf("\n"+ "Operaciones y clculos sin definir"+ "\n"); }
}
La implementacin de la clase derivada Circulo, se presenta a continuacin en la tabla5.4.3, que es parte de la solucin del ejercicio 5.4.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y endonde se necesite se puede invocar a las funciones de la clase padre utilizando lapalabra reservada supery finalmente se puede implementar todas las funciones de lainterface Figura.
Tabla 5.4.3:Cdigo de la clase Circulo del programa.
/** Cdigo del archivo Circulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public final classCirculo extendsPunto2D{
// Atributos de la clase.private floatmRadio;
// Mtodos de la clase.
// Constructor sin argumentos.publicCirculo()
{super(0.0f, 0.0f);setRadio(0.0f);
}
// Constructor con tres argumentos.publicCirculo(floatx, floaty, floatr){
super(x, y);
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
47/88
Programacin en Java para Ingenieros
47
setRadio(r);}
// Funcin que obtiene el radio de un crculo.public floatgetRadio(){
returnmRadio;}
// Funcin que inicializa el radio de un crculo.public voidsetRadio(floatradio){
// Se verifica que el radio del crculo no sea negativo.if(radio >= 0){
this.mRadio= radio;}else{
this.mRadio= 0.0f;}}
// Funcin que calcula el rea de un crculo.public floatArea(){
return((float)Math.PI* mRadio* mRadio);}
// Funcin que calcula el permetro de un crculo.public floatPerimetro(){
return(2 * (float)Math.PI* mRadio);}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un crculo e imprime esos resultados.public voidCalcular(){
System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo()
{ return("Crculo\n");}
// Funcin que obtiene los datos de un crculo y los imprime por// pantalla en forma de cadena.publicString getDatosCirculo(){
return("Centro = "+ super.getCoordenadas() +"; Radio = "+ getRadio());
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
48/88
Programacin en Java para Ingenieros
48
}
// Funcin que imprime los datos de un crculo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosCirculo());
}
// Funcin que lee las coordenadas 'x' e 'y' y el 'radio' de un crculo.public voidLeerDatos(){
String sData = "";super.LeerDatos();try{
System.out.printf("Ingrese el valor del radio: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();
mRadio= Float.parseFloat(sData);}catch(IOException e){
System.err.println("Error: "+ e.getMessage());}
}}
La implementacin de la clase derivada Rectangulo, se presenta a continuacin en latabla 5.4.4, que es parte de la solucin del ejercicio 5.4.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a la
clase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y endonde se necesite se puede invocar a las funciones de la clase padre utilizando lapalabra reservada supery finalmente se puede implementar todas las funciones de lainterface Figura.
Tabla 5.4.4:Cdigo de la clase Rectangulo del programa.
/** Cdigo del archivo Rectangulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
public final classRectangulo extendsPunto2D{
// Atributos de la clase.private floatmAncho;private floatmLargo;
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
49/88
Programacin en Java para Ingenieros
49
// Mtodos de la clase.
// Constructor sin argumentos.publicRectangulo(){
super(0.0f, 0.0f);setAncho(0.0f);setLargo(0.0f);
}
// Constructor con dos argumentos.publicRectangulo(floatx, floaty, floatancho, floatlargo){
super(x, y);setAncho(ancho);setLargo(largo);
}
// Funcin que obtiene la base de un rectngulo.public floatgetAncho(){
returnmAncho;}
// Funcin que inicializa la base de un rectngulo.public voidsetAncho(floatancho){
// Se verifica que el ancho del rectngulo no sea negativo.if(ancho >= 0){
this.mAncho= ancho;
}else{
this.mAncho= 0.0f;}
}
// Funcin que obtiene la altura de un rectngulo.public floatgetLargo(){
returnmLargo;}
// Funcin que inicializa la altura de un rectngulo.public voidsetLargo(floatlargo){
// Se verifica que el largo del rectngulo no sea negativo.if(largo >= 0){
this.mLargo= largo;}else{
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
50/88
Programacin en Java para Ingenieros
50
this.mLargo= 0.0f;}
}
// Funcin que calcula el rea de un rectngulo.public floatArea()
{ return(mAncho* mLargo);}
// Funcin que calcula el permetro de un rectngulo.public floatPerimetro(){
return(2 * mAncho+ 2 * mLargo);}
// Funcin que llama a las funciones de calcular el permetro y el rea// de un rectngulo e imprime esos resultados.public voidCalcular()
{ System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Rectngulo\n");}
// Funcin que obtiene los datos de un rectngulo y los imprime por// pantalla en forma de cadena.
publicString getDatosRectangulo(){return("Vrtice = "+ super.getCoordenadas() +
"; Ancho = "+ getAncho() +"; Largo = "+ getLargo());
}
// Funcin que imprime los datos de un rectngulo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosRectangulo());}
// Funcin que lee las coordenadas 'x' e 'y', el ancho y el largo// de un rectngulo.public voidLeerDatos(){
String sData = "";
super.LeerDatos();
try{
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
51/88
Programacin en Java para Ingenieros
51
System.out.printf("Ingrese el valor del ancho: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mAncho= Float.parseFloat(sData);
}
catch(IOException e){System.err.println("Error: "+ e.getMessage());
}
try{
System.out.printf("Ingrese el valor del largo: ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mLargo= Float.parseFloat(sData);
}
catch(IOException e){System.err.println("Error: "+ e.getMessage());
}}
}
La implementacin de la clase derivada Triangulo, se presenta a continuacin en latabla 5.4.5, que es parte de la solucin del ejercicio 5.4.
Esta clase tambin posee un grupo de atributos y mtodos que de manera similar a laclase Punto2D de la cual se deriva. Adems se realizan diferentes operaciones y endonde se necesite se puede invocar a las funciones de la clase padre utilizando la
palabra reservada supery finalmente se puede implementar todas las funciones de lainterface Figura.
Tabla 5.4.5:Cdigo de la clase Triangulo del programa.
/** Cdigo del archivo Triangulo.java*/
packagePaqueteFigurasGeometricas;
importjava.io.BufferedReader;importjava.io.IOException;
importjava.io.InputStreamReader;
public final classTriangulo extendsPunto2D{
// Atributos de la clase.private floatmA;private floatmB;private floatmC;
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
52/88
Programacin en Java para Ingenieros
52
// Mtodos de la clase.
// Constructor sin argumentos.publicTriangulo(){
super(0.0f, 0.0f);
setA(0.0f);setB(0.0f);setC(0.0f);
}
// Constructor con cuatro argumentos.publicTriangulo(floatx, floaty, floata, floatb, floatc){
super(x, y);setA(a);setB(b);setC(c);
}
// Funcin que obtiene el lado 'a' del tringulo.public floatgetA(){
returnmA;}
// Funcin que inicializa el lado 'a' del tringulo.public voidsetA(floata){
// Se verifica que el lado 'a' del tringulo no sea negativo.if(a >= 0){
this.mA= a;}else{
this.mA= 0.0f;}
}
// Funcin que obtiene el lado 'b' del tringulo.public floatgetB(){
returnmB;}
// Funcin que inicializa el lado 'b' del tringulo.public voidsetB(floatb){
// Se verifica que el lado 'b' del tringulo no sea negativo.if(b >= 0){
this.mB= b;}else
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
53/88
Programacin en Java para Ingenieros
53
{this.mB= 0.0f;
}}
// Funcin que obtiene el lado 'c' del tringulo.
public floatgetC(){returnmC;
}
// Funcin que inicializa el lado 'c' del tringulo.public voidsetC(float c){
// Se verifica que el lado 'c' del tringulo no sea negativo.if(c >= 0){
this.mC= c;}
else{this.mC= 0.0f;
}}
// Funcin que calcula el rea de un tringulo, con la frmula de Hern.public floatArea(){
floats = Semiperimetro(mA, mB, mC);return((float)Math.sqrt(s * (s - mA) * (s - mB) * (s - mC)));
}
// Funcin que calcula el semipermetro de un tringulo.private static floatSemiperimetro(floata, floatb, floatc){
return((a + b + c) / 2);}
// Funcin que calcula el permetro de un tringulo.public floatPerimetro(){
return(2 * Semiperimetro(mA, mB, mC));}
// Funcin que llama a las funciones de calcular el permetro y el rea
// de un tringulo e imprime esos resultados.public voidCalcular(){
// Se verifica la existencia de un tringulo, comprobando que la suma// de cualquiera de los dos lados de un tringulo sea mayor que el// tercer lado.if((mA+ mB> mC) && (mA+ mC> mB) && (mB+ mC> mA)){
System.out.printf("\n"+ "Permetro = "+ Perimetro() + "\n");System.out.printf("rea = "+ Area() + "\n");
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
54/88
Programacin en Java para Ingenieros
54
}else{
System.out.printf("El tringulo no existe...\n");}
}
// Funcin que obtiene el tipo de figura geomtrica.publicString getTipo(){
return("Tringulo\n");}
// Funcin que obtiene los datos de un tringulo y los imprime por// pantalla en forma de cadena.publicString getDatosTriangulo(){
return("Vrtice = "+ super.getCoordenadas() +"; Lado 'a' = "+ getA() +
"; Lado 'b' = "+ getB() +"; Lado 'c' = "+ getC());}
// Funcin que imprime los datos de un tringulo.public voidImprimirDatos(){
System.out.printf(getTipo() + getDatosTriangulo());}
// Funcin sin parmetros que lee las coordenadas 'x' e 'y',// los lados 'a', 'b' y 'c' de un tringulo cualquiera.public voidLeerDatos()
{ String sData = "";
super.LeerDatos();
try{
System.out.printf("Ingrese el valor del lado 'a': ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);sData = streamInput.readLine();mA= Float.parseFloat(sData);
}
catch(IOException e){System.err.println("Error: "+ e.getMessage());
}
try{
System.out.printf("Ingrese el valor del lado 'b': ");InputStreamReader isr = newInputStreamReader(System.in);BufferedReader streamInput = newBufferedReader(isr);
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
55/88
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
56/88
Programacin en Java para Ingenieros
56
cual utiliza un bucle para obtener el tipo de figura y leer los datoscorrespondientes a cada figura geomtrica, utilizando el arreglo de objetos detipo Figura, llamado ArrayDeFiguras, invoca a dos mtodos: a) MtodogetTipo, que se encarga de obtener el tipo de la figura geomtrica a la cualrepresenta; b) MtodoLeerDatos, que se encarga de leer los datos que lecorresponde de acuerdo a la figura geomtrica que representa. En este
apartado se utiliza el polimorfismo para asumir la forma de la figuracorrespondiente.
e) Parte 5:En la quinta parte de la clase Programa, en la seccin del programaprincipal principal void main se llama a la funcin estticaImprimirDatosYCalculos, donde se realizan los clculos matemticos y laimpresin de resultados. Aqu el arreglo de objetos de tipoFigura, llamado
ArrayDeFiguras, invoca a dos mtodos: a) MtodoCalcular, que se encarga derealizar los clculos matemticos del rea y permetro de la figura a la querepresenta; b) MtodoImprimirDatos, que se encarga de realizar la impresinde los resultados obtenidos. En este apartado tambin se utiliza el polimorfismopara asumir la forma de la figura correspondiente.
Tabla 5.4.6:Cdigo de la clase Programa de la aplicacin./** Cdigo del archivo Programa.java*/
packagePaqueteFigurasGeometricas;
public classPrograma{
// Parte 1: Declaracin de objetos.private staticPunto2D ObjPunto2D;private staticCirculo ObjCirculo;
private staticRectangulo ObjRectangulo;private staticTriangulo ObjTriangulo;private staticFigura ArrayDeFiguras[];
public static voidmain(String[] args){
// Parte 2: Impresin de mensajes de informacin.System.out.printf("Figuras Geomticas\n");System.out.printf("==================\n\n");
// Parte 3: Inicializacin de objetos.// Llamada a la funcin Inicializar.Inicializar();
// Parte 4: Lectura de datos.// Llamada a la funcin LeerDatos.LeerDatos();System.out.printf("\n");
// Parte 5: Clculos e impresin de resultados.// Llamada a la funcin ImprimirDatosYCalculos.ImprimirDatosYCalculos();
}
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
57/88
Programacin en Java para Ingenieros
57
// Funcin que permite crear e incializar objetos y un arreglo// de objetos que contiene a todo el resto de objetos.public static voidInicializar(){
ObjPunto2D= newPunto2D();
ObjCirculo= newCirculo();ObjRectangulo= newRectangulo();ObjTriangulo= newTriangulo();
ArrayDeFiguras= newFigura[4];
ArrayDeFiguras[0] = ObjPunto2D;ArrayDeFiguras[1] = ObjCirculo;ArrayDeFiguras[2] = ObjRectangulo;ArrayDeFiguras[3] = ObjTriangulo;
}
// Funcin que permite leer los datos de los objetos a travs
// de un arreglo de objetos.public static voidLeerDatos(){
for(inti = 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 voidImprimirDatosYCalculos(){for(inti = 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 cualjustamente 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 vercomo trabaja una interface con mtodos pblicos abstractos y ver como una clase basey sus clases derivadas implementan las funciones de la interface.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
58/88
Programacin en Java para Ingenieros
58
Tabla 5.4.7:Salida del programa.
Tabla 5.4.8:Salida del programa.
5.9. Resumen
La herenciapermite a una clase derivada (tambin llamada clase hija o subclase)heredar datos y mtodos de una clase base (tambin llamada clase padre osuperclase). De este modo, se puede solamente escribir una vez el cdigo generalcompartido y se lo puede pasar a lo largo de las clases especficas a travs de laherencia, permitiendo de esta manera ahorrar trabajo y reutilizar cdigo. Adems,desde el punto de vista de la programacin orientada a objetos en Java, la herenciapermite modelar el mundo real utilizando objetos y relaciones entre ellos con cdigo deprogramacin.
-
7/23/2019 Captulo 5 Herencia y Polimorfismo - Cxvs - Versin Final Corregida
59/88
Programacin en Java para Ingenieros
59
Cuando una clasecontiene una variable de algn tipo Tcomo una varia
top related