1 Herencia Agustín J. González ELO329. 2 padre hijo Como en biología, los niños heredan características de su padre Clasificación de Objetos En un intento.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Curso de Java Capitulo 7: Conceptos sobre poo Profesor:
Clases en C++.
Herencia en C#.
Arquitectura CLARO-TECNOTREE
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II Prof. Dr. Gustavo Patiño MJ
UNIVERSIDAD LATINA (UNILA) ENCAPSULACION Y HERENCIA
HERENCIA.
Modificadores.
Introducción a Java II.
Lic. Rosemary Torrico Bascopé
UNIVERSIDAD TECNOLÓGICA DE HERMOSILLO T.S.U. EN T.I.C., Área: Sistemas Informáticos Ing. José Padilla Duarte y estudiantes de Sistemas Informáticos Hermosillo,
Abstracción de los datos y Orientación a Objeto Clase 13.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
1 Persistencia en Java Agustín J. González ELO-329.
1 Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.
Clases en C++ Agustín J. González ELO329.
1 Polimorfismo y Funciones Virtuales Agustín J. González ELO329.
1 Introducción a Clases Agustín J. González ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2008.
UNIDAD VI Recursos esenciales de Java LSC. Natalia Rodríguez Castellón.
Metodología de Programación Ayudantía 5 lelagos.ublog.cl 2009.
1 Herencia Agustín J. González ELO Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González ELO329.
1 Introducción a Clases Agustín J. González Versión original de Kip Irvine ELO329.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
1 Definición y Conversión de datos Agustín J. González ELO-329.
1 Interfaces y Clases Internas ELO-329: Diseño y programación orientados a objetos Agustín J. González.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO326: Seminario II 2do. Sem
1 Herencia Agustín J. González Versión original de Kip Irvine ELO320: Seminario II 2do. Sem 2001.
Clases y Objetos en Java ELO329: Diseño y Programación Orientados a Objetos.
1 Polimorfismo y Funciones Virtuales Agustín J. González Versión original de Kip Irvine ELO329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO329.
Programación Orientada a Objetos
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
Programación orientada a objetos
Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend)‏ Agustín J. González ELO329.
Tipo de relación entre clases Es uno de los aspectos que distinguen el paradigma de orientación a objetos frente a otros paradigmas. Mecanismo que,
1 Definición y Conversión de datos Agustín J. González ELO-329.
Algunas Características de C++ no presentes en C Agustín J. González ELO-329.
Herencia en C++ Agustín J. González ELO329. Diseño y Programación Orientados a Objetos 2 Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Prof. Manuel B. Sánchez. Es un mecanismo y uno de los pilares de la POO que permite definir nuevas clases a partir de otras preexistentes. La Herencia.
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Polimorfismo y Funciones Virtuales
Polimorfismo y Métodos Virtuales
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Polimorfismo y Métodos Virtuales
Herencia Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Herencia en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Herencia en C++ Agustín J. González ELO329.
Agustín J. González Versión original de Kip Irvine ELO329
Polimorfismo en C++ y Métodos Virtuales
Herencia Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Transcripción de la presentación:

1 Herencia Agustín J. González ELO329

2 padre hijo Como en biología, los niños heredan características de su padre Clasificación de Objetos En un intento en modelar el mundo real los diseñadores clasifican los objetos. Herencia implica una relación en la cual ciertas características son heredadas.

3 Electric Gasoline Diesel Solar Steam Wind Tipos de Motores Claramente todos estos casos están relacionados. ¿Qué podrían todos estos motores tener en común?

4 Motor class: Serial number Manufacturer Date of Manufacture Model Number etc. Motores La información común puede ser descrita en una clase base llamada Motor:

5 Motor ElectricMotorGasolineMotor Relación de Herencia Las flechas muestran que las clases ElectricMotor y GasolineMotor son clases derivadas de la clase Motor. Es un

6 istream ifstream Deriva de Relación de Herencia... Muchas otras clases tienen esta relación, tales como las clases istream (flujo de entrada) y ifstream (flujo de entrada de archivo).

7 Employee Salaried Employee Hourly Employee Commission Employee Ejemplo: Empleados Podríamos clasificar empleados basados en cómo se les paga...

8 Employee Full-timePart-timeTemporary Tipos de Empleados...o podríamos clasificarlos basados en su estatus:

9 Vehicle Dune BuggyMotorCycle Relaciones de Herencia... Algunas relaciones son un tanto remotas....

10 PassengerVehicle SportUtilityMiniVan Relaciones de herencia... Otras son muy específicas:

11 PassengerVehicle BusTaxicab CargoVehicle FlatbedTruckForkLift CommercialVehicle Vehicle Múltiples Niveles son posible

12 Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.

Motor ElectricMotor Motor y ElectricMotor Un objeto ElectricMotor contiene el mismo número de identificación (ID) como un Motor, más el voltaje.

14 class CMotor { public: CMotor() { } CMotor( const string & id ); string get_ID() const; void set_ID(const string & s); void Display() const; void Input(); private: string m_sID; }; // más... Clase CMotor Definición de la clase CMotor:

15 CMotor::CMotor( const string & id ) { set_ID(id); } string CMotor::get_ID() const { return m_sID; } void CMotor::set_ID(const string & s) { m_sID = s; } void CMotor::Display() const { cout << "[CMotor] ID=" << m_sID; } void CMotor::Input() { string temp; cout << "Enter Motor ID: "; cin >> temp; set_ID(temp); }

16 La clase base debe aparecer primero en las declaraciones. Cuando la clase derivada es declarada, ésta menciona a la clase base. Cualquier número de clases pueden ser derivadas de una misma clase base. Un clase puede derivarse de más de una clase base (ojo no permitido en JAVA) Creación de Clases Derivadas class base {... }; class derived : public base {... };

17 Clase CElectricMotor class CElectricMotor : public CMotor { public: CElectricMotor(); CElectricMotor(const string & id, double volts); void Display() const; void Input(); void set_Voltage(double volts); double get_Voltage() const; private: double m_nVoltage; };

18 CElectricMotor::CElectricMotor(const string & id, double volts) : CMotor(id) { m_nVoltage = volts; } Un inicializador de clase base llama al constructor de la clase base. En este ejemplo, el número ID del motor es pasado al constructor de CMotor. Inicializador de Clase Base

19 La función Input existe en ambas clases CMotor y CElectricMotor. En lugar de duplicar el código ya escrito, se llama al método correspondiente en la clase base: Llamando a métodos de la clase base void CElectricMotor::Input() { CMotor::Input(); // call base class first double volts; cout << "Voltage: "; cin >> volts; set_Voltage(volts); }

20 Esta es la función Input en la clase CMotor: Llamado de Métodos de la clase Base void CMotor::Input() { string temp; cout << "Enter Motor ID: "; cin >> temp; set_ID(temp); }

21 La función Display funciona de la misma manera. Ésta llama a CMotor::Display primero. Función o método de Despliegue void CElectricMotor::Display() const { // call base class function first CMotor::Display(); cout << " [CElectricMotor]" << " Voltage=" << m_nVoltage << endl; }

22 Un programa de prueba puede crear instancias de ambas clases CMotor y CElectricMotor. Probando las Clases CMotor mot("33333"); mot.Display(); cout << endl; CElectricMotor elec("40000",220.0); elec.Display(); cout << endl;

23 Cuando usamos instancias de clases derivadas de otra, podemos llamar a funciones de la clase base y la derivada. Igual que en Java. Probando Clases CElectricMotor elec; // CElectricMotor elec.set_ID("40000"); // CMotor elec.set_Voltage(220.0); // CElectricMotor

24 Cuando el mismo nombre de función existe en ambas clases, C++ automáticamente llama la función implementada para la clase derivada. Éste es el caso con las funciones Input y Display: Probando Clases elec.Input(); // CElectricMotor elec.Display(); // CElectricMotor

25 Podemos asignar objetos de clases derivadas a un objeto de la clase base. Esto es llamado rebanado de objeto (object slicing). Igual que en Java Asignación de Objetos CMotor mot; CElectricMotor elec; mot = elec; // sliced down to a motor elec.get_Voltage(); // ok mot.get_Voltage(); // error

26 Pero no podemos asignar una instancia de una clase base a una instancia de una clase derivada (igual que en Java). Ello permitiría referencias a miembros no existentes. Asignación de Objetos CMotor mot; CElectricMotor elec; elec = mot; // error elec.set_Voltage( 220 ); // ???

27 Acceso a miembros Protected (Protegidos) Miembros de una clase designados como protected son visibles a ambos la clase actual y las clases derivadas. (y a clases amigas -friend- pero a nadie más)

28 Aquí hay un ejemplo que usa el calificador protected para limitar la visibilidad de get_ID y set_ID: Clases con miembros Protected class CMotor { public: CMotor() { } CMotor( const string & id ); protected: string get_ID() const; void set_ID(const string & s); //...

29 El programa principal no puede llamar set_ID y get_ID porque ellos son protegidos: Acceso a miembros Protected CMotor M; M.set_ID("12345"); // error M.get_ID(); // error

30 Pero funciones en CElectricMotor sí pueden acceder set_ID: Acceso a miembros Protected CElectricMotor::CElectricMotor( const string & id, double volts) { m_nVoltage = volts; set_ID(id); }

31 Supongamos por un momento que Cmotor usa miembros públicos para todas sus funciones: Herencia Protegida class CMotor { public: CMotor() { } CMotor( const string & id ); string get_ID() const; void set_ID(const string & s); //...

32 Podemos usar el calificador protected cuando creemos una clase derivada. Todas las funciones públicas en la clase base pasan a ser protegidas en la clase derivada. Herencia Protegida class CElectricMotor : protected CMotor { //... };

33 Por ejemplo, el programa principal no puede llamar set_ID y get_ID en un motor eléctrico porque las funciones no son públicas en esta clase: Herencia Protegida CElectricMotor EM; EM.set_ID("12345"); // error EM.get_ID(); // error

34 Puede ser que el autor de la clase CElectricMotor no quiera dar a conocer el número ID del motor. Funciones en CElectricMotor sí pueden acceder funciones públicas en CMotor. Un ejemplo: Herencia Protegida CElectricMotor::CElectricMotor( const string & id, double volts) { m_nVoltage = volts; set_ID(id); }

35 La herencia privada causa que todas las funciones declaradas en la clase base sean privadas en la clase derivada. Pareciera que no hay diferencia con herencia protegida: Funciones en CElectricMotor pueden acceder funciones miembros en CMotor... Herencia Privada class CElectricMotor : private CMotor { //... };

36 Pero cuando derivamos una nueva clase (CPumpMotor) de CElectricMotor, la diferencia se hace notar: funciones en CPumpMotor no pueden acceder miembros públicos de CMotor. Herencia Privada class CPumpMotor : public CElectricMotor { public: void Display() { CMotor::Display(); // not accessible! CElectricMotor::Display(); // this is OK } };