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

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

of 88

  • date post

    17-Feb-2018
  • Category

    Documents

  • view

    231
  • download

    0

Embed Size (px)

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

  • 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: ");

    InputStreamR