Logo Studenta

Práctica 7 V2

¡Este material tiene más páginas!

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

Continuar navegando