Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Carátula para entrega de prácticas Facultad de Ingeniería Laboratorio de docencia Laboratorios de computación salas A y B Profesor: Saavedra Hernández Honorato Ing. Asignatura: Programación Orientada a Objetos Grupo: 1 No de Práctica(s): 7 Integrante(s): Ayala Trejo Albanya Yendalli Téllez González Jorge Luis Méndez Costales Luis Enrique Villamar Cortes Juan Antonio Santana Sánchez María Yvette Zecua Salinas Juan Carlos Téllez González Jorge Luis Villamar Cortes Juan Antonio Zecua Salinas Juan Carlos No. de Equipo de cómputo empleado: --- No. de Lista o Brigada: Semestre: 2020-2 Fecha de entrega: 24/03/2020 Observaciones: CALIFICACIÓN: __________ Facultad de Ingenierı́a Programación Orientada a Objetos Índice 1. Introducción 2 2. Objetivo 2 3. Herencia 2 3.1. Relaciones IS-A y HAS-A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.2. Clase Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4. Sobreescritura/Overriding 7 4.1. Constructores en la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.2. Sobrecarga/Overloading vs Sobrescritura/Overridding . . . . . . . . . . . . . . . . . . . . 10 5. Conclusiones 11 1 Facultad de Ingenierı́a Programación Orientada a Objetos 1. Introducción En el paradigma de la programación orientado a objetos el uso del concepto de herencia juega un papel muy importante, incluso resulta poco probable no utilizar en el más pequeño de los programas esta caracterı́stica esencial. Es por ello que la herencia es un recurso que los programadores acabaran usando tarde o temprano. Resulta esencial introducir el termino de herencia y sus implicaciones: todas las clases que se crean dentro de un lenguaje orientado a objetos, como Java, heredan de manera implı́cita de la clase Object; es por esto se pueden comportar como objetos. La herencia nos permite o nos ayuda a crear nuevos objetos que heredan o asumen las propiedades de los objetos ya existentes, es decir, permite crear nuevos objetos que tienen propiedades de objetos ya existentes. Existen muchas razones para usar herencia, las más comunes son: 1. Promover la reutilización de código. 2. Usar polimorfismos. Figura 1: Los diferente tipos de vehı́culos heredan caracterı́sticas de un tipo básico en particular. 2. Objetivo Implementar los conceptos de herencia en un lenguaje de programación orientado a objetos. 3. Herencia Herencia es el proceso que implica la creación de clases a partir de clases ya existentes, permitiendo agregar mas funcionalidades. Al utilizar herencia la jerarquı́a queda establecida de manera implı́cita, partiendo de la clase general o base a la especifica o derivada. 2 Facultad de Ingenierı́a Programación Orientada a Objetos La clase que hereda de una super clase es llamada subclase o clase derivada: hereda todas las propiedades y métodos visibles de la clase base y puede agregar propiedades y métodos propios. Para heredar en Java se utiliza la palabra reservada extends al definir la clase, su sintaxis es: Figura 2: Sintáxis de declaración. Los objetos de las clases derivadas o subclases se crean, o dicho de otra forma, se instancian igual que los de la clase base y pueden acceder tantos a atributos y métodos propios como a los de la clase base. Es importante mencionar que Java no soporta la multiherencia. Figura 3: Ejemplo de herencia en UML. En [3] se puede notar que la flecha apunta hacia la clase Empleado: esto indica que está heredando de él, por lo que la clase Gerente es la clase derivada, o bien, la subclase. Para trasladar lo anterior a Java, se ha creado un proyecto en NetBeans y el problema se ha dividido en 3 partes: 3 Facultad de Ingenierı́a Programación Orientada a Objetos 1. La clase base ’Empleado’. 2. La sub clase ’Gerente’. 3. La clase principal de prueba. Figura 4: Clase Empleado en Java. Cada uno de los atributos que componen a los objetos de tipo Empleado han sido encapsulados con el fin de tener control de sus atributos durante el proceso de creación. Ası́ mismo, posee un método denominado aumentarSueldo, el cual aumenta el sueldo inicial asignado a un empleado por un porcentaje dado. La clase Gerente heredará los atributos y métodos definidos en la clase padre, por lo que únicamente se requiere declarar los atributos y métodos especı́ficos para la clase hija: para el atributo presupuesto se generá, además de los métodos propios del encapsulado, el método asignarPresupuesto que reasigna el 4 Facultad de Ingenierı́a Programación Orientada a Objetos valor previo del presupuesto a un objeto de tipo Gerente, como puede verse a continuación. Figura 5: Clase Gerente en Java. Finalmente, en la clase principal de prueba se han utilizado las siguientes lı́neas de código con el fin de poner a prueba las clases descritas con anterioridad. Figura 6: Clase de prueba 5 Facultad de Ingenierı́a Programación Orientada a Objetos Figura 7: Salida obtenida. 3.1. Relaciones IS-A y HAS-A La relación IS-A permite afirmar que un objeto es de un tipo en especı́fico. Por ejemplo, dadas las siguientes lı́neas: Figura 8: Clases hijas de Animal y Caballo, respectivamente. Dada la jerarquı́a de clases anterior se puede afirmar que: Caballo hereda de Animal, lo que significa que Caballo IS-A (es un) Animal. Luego, Purasangre hereda de Caballo, lo que significa que Purasangre IS-A (es un) Caballo. La relación HAS-A es un concepto que se vio en el tema de Abstracción y Encapsulamiento como composición. Esta relación se basa en una clase X HAS-A Y , si el código en la clase X tiene como atributo una referencia de la clase Y . Por ejemplo, sea el siguiente ejemplo: Figura 9: Clase hija de Animal que implementa una silla de montar como atributo. Dada la jerarquı́a de clases anterior se puede afirmar que: Un Caballo HAS-A (tiene) una SillaMontar, debido a que cada instancia de Caballo tendrá una referencia hacia una SillaMontar. 6 Facultad de Ingenierı́a Programación Orientada a Objetos 3.2. Clase Object En Java existe una superclase implı́cita en todas las clases llamada Object, la cual hereda métodos como lo son toString, equals, clone, entre otros. Para conocer si un objeto instancia de alguna clase, se utiliza el operador instanceo f . Utilizando tal operador, puede comprobarse la existencia de la superclase Object. En el proyecto creado se han añadido las siguiente lı́neas de código, las cuales permitarán saber si los objetos creado son instancias de tipo Empleado y del tipo Object. Figura 10: Lı́neas añadidas al método de la clase principal. Figura 11: Salida obtenida. De lo anterior, es posible concluir que cualquier objeto de cualquier clase va a heredar de la clase Object, sin excepción alguna. 4. Sobreescritura/Overriding Al momento de realizar el proceso de herencia a partir de otra clase, puede darse el caso de que el compor- tamiento de alguno de los métodos heredados no sea el esperado. Para solucionar tal problema, se hace uso de la sobreescritura de tal método, es decir, se redefine el comportamiento del mismo en una subclase en particular. De esta forma, el método sobreescrito puede adaptarse a las necesidades de cada subclase. Por ejemplo, el método toString se define dentro de la clase Ob ject, el cual genera una represen- tación en cadena de la información de un objeto. Si tal método desea usarse a un objeto Empleado, se 7 Facultad de Ingenierı́a Programación Orientada a Objetos encontrará con el problema de que el método únicamente se encuentra definido para Ob ject, y descono- ce los atributos de Empleado. Por tanto, dichos atributos no se podrán trasladar a una representación en cadena. En general, un método sobreescrito debe de seguir las siguientes reglas: Tener el mismo nombre que el método que se heredó y se desea sobreescribir. Debe tenerel mismo tipo y número de parámetros. El nivel de acceso debe ser idéntico o más accesible. El valor de retorno debe ser idéntico o un tipo derivado. Cabe señalar que la sobreescritura queda irremediablemente ligada a la herencia y carece de sentido fuera de este concepto. Dicho de otra forma, es imposible sobreescribir un método dentro de la misma clase, ya qué el compilador detectarı́a dos métodos idénticos en nombre y parámetros, arrojando un error de compilación en consecuencia. En el siguiente ejemplo, se ha sobreescrito el método toString y se ha añadido a la clase Empleado, con el fin de obtener información de los atributos de un objeto de este tipo. Ası́ mismo, se ha sobreescrito toString en la clase Gerente con el fin de que, además de la información arrojada en la sobreescritura inicial, el método imprima el presupuesto asignado a tal objeto. Figura 12: Sobreescritura de toString para la clase Empleado. El método sobreescrito en la clase padre puede reescribirse una vez más en la clase hija, haciendo referencia al mismo con la palabra reservada super, como puede verse a continuación: Figura 13: Sobreescritura de toString para la clase Gerente. 8 Facultad de Ingenierı́a Programación Orientada a Objetos NetBeans añade la advertencia de añadir la etiqueta @Override, con el fin de especificar que el método presente es una sobreescritura de otro definido previamente. La sobreescritura anterior permite obtener información directa del objeto y sus atributos definidos. En el siguiente ejemplo, se muestran las lı́neas añadidas para obtener la información de un objeto Gerente, sin necesidad de añadir lı́neas de impresión de forma manual en método main: Figura 14: Lı́neas utilizadas para establecer e imprimir los datos del objeto gerente. Figura 15: Salida obtenida. 4.1. Constructores en la herencia Los constructores, como se ha visto previamente, son métodos que tienen el mismo nombre que la clase de la que provienen, cuyo propósito es inicializar los atributos de un nuevo objeto proveniente de tal clase. Cuando se crea un objeto de una clase derivada se crea, implı́citamente, un objeto de la clase base que se inicializa con su constructor correspondiente. Si cuando se crea el objeto se utiliza el constructor sin argumentos, entonces se está realizando una llamada impl ı́cita al constructor de la clase base. La palabra reservada super permite acceder a los elementos de la clase base (hecho observable en [13]). A continuación, se puede observar el uso de la sentencia super para poder acceder a los atributos de la clase base Empleado desde la clase Gerente. 9 Facultad de Ingenierı́a Programación Orientada a Objetos Figura 16: Uso de la referencia super en el constructor de la clase Gerente. Por medio de las lı́neas añadidas en el constructor de Gerente, se hace referencia y se invoca al constructor de la clase Empleado. Cabe señalar que la llamada al constructor de la ssuperclase debe ser la primera sentencia del constructor de la subclase. Creando un objeto de tipo Gerente con nombre ’Luis Aguilar’, con número de empleado 8524, un sueldo de 16000 y un presupuesto asignado de 5000, si se utiliza el método toString, el método invocará el método sobreescrito en la superclase. Finalmente, si se imprime el objeto de la forma Sys- tem.out.println(gerente), se obtendrá la salida mostrada en la Figura 16. 4.2. Sobrecarga/Overloading vs Sobrescritura/Overridding Una de las cosas que más confunden a los programadores novatos son las diferencias entre los conceptos de sobrecarga y sobrescritura. La sobreescritura es un concepto que únicamente tiene sentido en la herencia y se refiere al hecho 10 Facultad de Ingenierı́a Programación Orientada a Objetos de volver a definir un método heredado. La sobrecarga sólo tiene sentido en la clase misma, se pueden definir varios métodos con el mismo nombre, pero con diferentes tipos y número de parámetros en ella. 5. Conclusiones A través del trabajo realizado se ha podido aplicar a profundidad el concepto de herencia como uno de los pilares fundamentales del paradigma orientado a objetos. El uso de este concepto permite ahorrar una notable cantidad de escritura de código y permite definir de forma más clara las relaciones existentes entre los diferentes objetos que coexisten en una aplicación. Ası́ mismo, es observable que el uso de este concepto requiere de reglas definidas, en este caso particular, por Java. La sobreescritura de métodos requiere tener en cuenta las particularidades de las clases hijas y las modificaciones que los métodos heredados requieren para funcionar adecuadamente y cumplir su papel. Por otra parte, los métodos constructores de las clases hijas deben de tener en cuenta el constructor definido para la clase padre. Por lo anterior, las palabras reservadas super y la etiqueta @Override son indispensables durante el proceso. Finalmente, es posible concluir que la herencia es un concepto muy versátil que permite abstraer un problema y desarrollar una solución eficaz, analizando las relaciones entre los elementos que componen al problema. En resumen, el uso de este concepto debe de acompañar a un programador experimentado en Java durante todo su proceso de aprendizaje y desarrollo. Referencias [1] Herencia. Recuperado de: http://lcp02.fi-b.unam.mx/static/docs/PRACTICAS_POO/poo_p7. pdf. Fecha de consulta: 19/03/2020. Los créditos de las fotografı́as pertenecen a sus respectivos autores. c© LATEX 11 http://lcp02.fi-b.unam.mx/static/docs/PRACTICAS_POO/poo_p7.pdf http://lcp02.fi-b.unam.mx/static/docs/PRACTICAS_POO/poo_p7.pdf Introducción Objetivo Herencia Relaciones IS-A y HAS-A Clase Object Sobreescritura/Overriding Constructores en la herencia Sobrecarga/Overloading vs Sobrescritura/Overridding Conclusiones
Compartir