Download - Capítulo 5 Herencia y Polimorfismo - Cxvs - Versión Final Corregida

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