Lectura HERENCIA Fuente: JOYANES A. y ZAHONERO, M. (2002) La mayoría de las personas ven el mundo como un conjunto de objetos que están relacionados entre sí de modo jerárquico (Figura 1, Animal, Mamifero, Perro). Si se desea describir animales de un modo abstracto, se deben indicar algunos atributos tales como tamaño, peso, raza y nombre. Los animales tienen ciertos aspectos de comportamiento; ellos comen, duermen y saltan. Esta descripción de los atributos y los comportamientos es la definición de la clase Animal. Si se desea describir una clase más específica de animales, tales como Mamiferos, tendrán más atributos específicos, tales como tipos de dientes y glándulas mamarias. Esta clase se conoce como una s u b c l a s e de Animal, y los animales se conocen como s u p e r c l a s e de Mamiferos. Esta subclase hereda todos los atributos de cada uno de sus ascendientes en la j e r a r q u í a d e clases. Animal Mamifero Perro Figura 1. Jerarquía de clases. Herencia Fuente: Deitel & Deitel. (1999) Al crear una clase nueva, en lugar de escribir datos miembro y funciones miembro totalmente nuevos, el programador puede indicar que la nueva clase deberá heredar los datos miembro y las funciones miembro de una c l a s e b a s e (s u p e r c l a s e , c l a s e m a d r e ) ya definida con anterioridad. La nueva clase se conoce como c l a s e d e r i v a d a (s u b c l a s e , c l a s e h i j a ). Cada clase derivada en sí misma se vuelve candidata a ser clase base de otra clase base posterior. En la h e r e n c i a s i m p l e , una clase se deriva a partir de una clase base. En la h e r e n c i a m ú l t i p l e , una clase derivada hereda de varias clases base (posiblemente no relacionadas entre ellas). La herencia simple es directa. La herencia múltiple es complicada y tiene tendencia a los errores, el programador debe ser cuidadoso al utilizarla. Una clase derivada puede agregar datos miembro y funciones miembro propias, por lo que puede ser mayor que su clase base. Una clase derivada es más específica que su clase base y representa un grupo de objetos más pequeño. La fuerza real de la herencia Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 2003. 2 Herencia proviene de la capacidad de definir en la clase derivada, adiciones, sustituciones y refinaciones a las características heredadas de la clase base. La Figura 2 muestra un ejemplo de herencia simple, la clase Empleado hereda propiedades y comportamientos de la clase base Persona. Clase base Persona Persona String nombre String direccion int codPostal long int telefono Persona() entradaPersona() impPersona() Clase derivada Empleado Empleado String nombre String direccion int codPostal long int telefono entradaPersona() impPersona() dependientes periodoTrabajado revPeriodo() Figura 2. Herencia simple C++ ofrece tres tipos de herencia: public, protected y private. Con la herencia public, todos los objetos de una clase derivada también pueden considerarse como objetos de la clase base de dicha clase derivada. Sin embargo lo opuesto no es cierto: los objetos de la clase base no son objetos de la clase derivada de dicha clase base. Esta relación “objeto de clase derivada es objeto de la clase base” se aprovecha frecuentemente para realizar algunas interesantes manipulaciones. Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 2003. 3 Herencia ESTRUCTURA DE LA HERENCIA Cuando se hereda se pueden reutilizar las clases existentes o añadirle funcionalidad a las clases existentes, creando, por lo tanto, clases más poderosas. El proceso de heredar una clase de otra se llama derivación o también extensión. Esto es, cuando se hereda una clase de otra, se deriva la nueva clase a partir de la clase original, o también se dice que la nueva clase es una extensión de la clase original. El conjunto completo de clases derivadas, desde la clase base, hasta todas sus clases derivada, es llamado J era rqu í a de l a he renc ia . Como sucede con los rasgos familiares, las jerarquías de herencia pueden contener varias capas. Por ejemplo una clase madre llamada Persona puede producir tres clases hijas llamadas Empleado, Cliente y Vendedor. La clase Empleado puede ser usada por sí misma para derivar dos clases más, Planta y Eventual. La clase Eventual también puede ser usada para derivar dos clases más llamadas TiempoParcial y TiempoCompleto, como se muestra en la Figura 3: Persona Empleado Cliente DePlanta Vendedor Eventual TiempoParcial TiempoCompleto Figura 3. Jerarquía de Clases Corregir esta figura faltan las flechas usar UML La jerarquía de herencia anterior, consiste en herencia simple. En las jerarquías de herencia simple una clase derivada tiene una y solo una madre. Fuente: BISHOP Judy. (1999) Con la herencia nos concentramos en definir una clase que conocemos bien y dejamos abierta la opción de definir más tarde versiones nuevas de ella. Estas versiones heredarán las propiedades y las características de la clase original, y por tanto pueden ser más pequeñas y más limpias. De esta manera construimos jerarquías de clases y podemos enfocar al nivel adecuado los cambios y los añadidos. Como todas las clases de la Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 2003. 4 Herencia jerarquía pertenecen a la misma familia, todas ellas tienen el mismo tipo en el mecanismo de tipos de Java, y se puede usar una de ellas donde podría requerirse la otra. Fuente: GREG, Perry. (1993) En los departamentos de procesamiento de datos por todo el mundo, todo el tiempo se están diseñando y escribiendo programas nuevos. Cuando escriben programas nuevos, los programadores usan con frecuencia el código de programas existentes. Aunque el proceso de copiar y pegar da lugar a errores, usar partes del código fuente de programas existentes es más rápido que la reescritura de todo ese código a partir de cero. Por ejemplo un programa de personal puede llevar cuenta de los empleados de planta y eventuales. Estos dos tipos de empleados tienen información similar (nombre, dirección, número de teléfono, edad, etcétera), pero con algunas diferencias, como la determinación de sus pagos, por ejemplo. Estos empleados también comparten características con las variables de personas que ya están codificadas para los clientes en otros programas. Mediante la herencia, la OOP ayuda a que los individuos y compañías produzcan código más rápido al quitarle al programador muchos de los detalles de la reutilización del código, permitiéndole al mismo tiempo, que sean usadas parte de un programa en otro. Las estructuras de datos no son el único tipo de elemento de programación del que se puede heredar. Se pueden heredar ventanas, botones, pantallas, gráficos y muchas cosas más. Se puede heredar cualquier cosa que pueda ser representada como un objeto. La herencia evita el problema de cortar y pegar código de una parte de un programa a otro cuando se quieren compartir partes de programas. También la herencia hace que el código este libre de definiciones de datos y código duplicados. HERENCIA EN JAVA En Java, la clase de la que se hereda se denomina s u p e r c l a s e . La clase derivada de la superclase se denomina s u b c l a s e . A veces una superclase se conoce también como c l a s e p a d r e o c l a s e b a s e . Y una subclase se conoce como c l a s e h i j a , c l a s e e x t e n d i d a o c l a s e d e r i v a d a . Se pueden reutilizar o cambiar los métodos de la superclase y se pueden añadir nuevos datos y nuevos métodos en las subclases. Java soporta el mecanismo de extensión (extend), que permite crear clases derivadas o clases que son extensión de otra clase, de modo que la nueva clase hereda todos los miembros datos y métodos que pertenecen a la clase base ya existente. Java no soporta la herencia múltiple. En Java existe la restricción de que una clase puede extender a una sola clase. Sin embargo, una misma clase puede implementar varias i n t e r f a c e s , con lo que se obtiene un efecto semejante. Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 2003. Herencia 5 Referencias: BISHOP Judy. (1999). Java Fundamentos de Programación DEITEL & Deitel. (1999). C++ como programar. Segunda Edición. Prentice may. Pág. 520. JOYANES A. y ZAHONERO, M. (2002). Programación en Java 2. Algoritmos, Estructuras de Datos y Programación Orientada a Objetos. Mc Graw Hill. Pág. 72 GREG, Perry. (1993). Aprendiendo Programación Orientada a Objetos con Turbo C++ en 21 Días. Prentice Hall Hispanoamericana, S.A. Pág. 446 Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 2003.