PresentaciónProgramación Orientada a Objetos   Ing. Mauricio Paletta, Msc       INGENIERÍA EN INFORMÁTICA                 ...
Programación Orientada a Objetos• ¿Cómo llevar a código todos los conceptos, principios y  términos técnicos de la orienta...
Programación Orientada a Objetos• Algunas sugerencias: Microsoft Visual Studio, Borland  Delphi 2005, Borland BuilderX, Bo...
Programación Orientada a ObjetosC++ • Compilado => permite generar programas ejecutables. • No es puro porque viene del l...
Programación Orientada a ObjetosJava • Pseudo-interpretado (Java bytecode)       se requiere un   motor o máquina de ejec...
Programación Orientada a ObjetosC# • 70% Java, 10% C++, 5% Visual Basic, 15% cosas   nuevas. • Pseudo-interpretado (Micro...
Definición de Clases C++                                     Identificador de Indica definición                          ...
Definición de ClasesC++ • Las declarativas de interfaz pueden aparecer más de   una vez y en cualquier orden. Si no se in...
Definición de ClasesC++                                          Indica relación de dependencia                          ...
Definición de ClasesC++ • El cuerpo de los métodos inline debe ser simple, sin   estructuras de control complejas (ciclos...
Definición de ClasesC++       inline double Complejo::ObtReal(void) {           return Real;       }       inline double ...
Definición de Clases Java / C#                               Identificador de Indica definición                          ...
Definición de ClasesJava • Las declarativas de interfaz pueden aparecer más de   una vez y en cualquier orden. Si no se i...
Definición de ClasesC# • Las declarativas de interfaz pueden aparecer más de   una vez y en cualquier orden. Si no se ind...
Definición de ClasesC#                                                             Se puede acceder                      ...
Instanciación de ObjetosC++                    Instancias u objetos                  (instanciación estática)            ...
Instanciación de ObjetosJava        Identificador         de la Clase     Instancia u objeto               Complejo C1 = ...
Instanciación de ObjetosC#      Identificador       de la Clase     Instancia u objeto             Complejo C1 = new Comp...
Acceso a Elementos de la ClaseC++                    Complejo C, *pC = new Complejo; Operador para                    dou...
Acceso a Elementos de la ClaseJava / C#                  Complejo C = new Complejo( );                  double d = C.ObtR...
Acceso a Elementos de la ClaseC#        Complejo C = new Complejo( );        double d = C.ParteReal;              Operado...
Constructor• Basado en el principio de persistencia.• Es un método particular que es ejecutado automáticamente  durante la...
ConstructorC++       class Complejo {           private:                           No está permitido la              doub...
ConstructorJava / C#   class Complejo {                                      Se permite la inicialización       private d...
Polimorfismo• Basado en el principio que lleva el mismo nombre.• Definir dos o más métodos con el mismo nombre, tipo de  r...
PolimorfismoC++       class Complejo {           private:              double Real, Imag;          public:              C...
PolimorfismoJava / C#      class Complejo {          private double Real = 0.0;          private double Imag = 0.0;      ...
Inicialización por defecto• Permite especificar un valor inicial por defecto a los  parámetros de un método para los casos...
Inicialización por defectoC++            class Complejo {                private:                   double Real, Imag;   ...
Inicialización por defectoC++            class Complejo {                …                public:                   Compl...
Inicialización por defectoJava / C# • Concepto no soportado en estos lenguajes. • Se permite inicialización de elementos ...
Destructor• Basado en el principio de persistencia.• Es un método particular que es ejecutado  automáticamente durante la ...
Destructor• Como método/operación tiene las siguientes  características:   o   Es opcional.   o   Debe ser público.   o   ...
DestructorC++                          class Complejo {                              private:El destructor se llama      ...
DestructorJava    protected void finalize( ) {       …                            Se puede redefinir el método    }      ...
DestructorC#  class Complejo {              Al igual que Java, se puede      …                         redefinir el métod...
Elementos estáticos• Basado en el principio de concurrencia.• Permite que todos los objetos instanciados de una misma  cla...
Elementos estáticos• Un ejemplo típico de Java / C#, es el caso particular del  método que representa el programa principa...
Elementos estáticosC++                                                             Indica que             class String;  ...
Elementos estáticosC++                                                     Asignación del valor                          ...
Elementos estáticosJava                                                    La clase que contiene public class Ejemplo {  ...
Elementos estáticosC#                                                    La clase que contiene public class Ejemplo {    ...
Operador de Asignación o Copia• Los lenguajes orientados a objetos manejan internamente  el uso del operador natural de as...
Operador de Asignación o Copia• Los lenguajes que soportan la sobrecarga de operadores  pueden dar su propia definición de...
Operador de Asignación o CopiaC++                                                     Construcción indirecta Complejo C1(...
Sobrecarga de Operadores• Basado en el principio de polimorfismo.• Permite escribir una implementación propia sobre el uso...
Sobrecarga de OperadoresC++ • Se pueden sobrecargar los siguientes operadores:  o   Aritméticos: +, -, *, /, %, ++, --, +...
Sobrecarga de OperadoresC++ • No es posible modificar la asociatividad del operador y   tampoco la semántica de interpret...
Sobrecarga de OperadoresC++  class Complejo {      private:         double Real, Imag;       public:         …         //...
Sobrecarga de OperadoresC++  class Complejo {      private:         double Real, Imag;     public:         …         oper...
Sobrecarga de OperadoresJava  class Complejo {      private double Real = 0.0;      private double Imag = 0.0;      …    ...
Sobrecarga de OperadoresC# • Se pueden sobrecargar los siguientes operadores:  o   Aritméticos: +, -, *, /, %, ++, --.  o...
Sobrecarga de OperadoresC# • Al sobrecargar un operador binario op, también se   sobrecarga el operador de asignación cor...
Sobrecarga de OperadoresC#  class Complejo {      private double Real = 0.0;      private double Imag = 0.0;      …      ...
Sobrecarga de OperadoresC#  class Complejo {      …      public static explicit operator double(Complejo C) {         ret...
Referencia al objeto actual• Variable predefinida que permite al programador hacer  referencia al objeto actualmente insta...
Referencia al objeto actual• En Java, this se puede usar como una función dentro de  un constructor para hacer una llamada...
Referencia al objeto actualC++  class Complejo {         …      public:         …         Complejo &operator ++(void) {  ...
Referencia al objeto actualJava   class Complejo {       private double Real = 0.0;       private double Imag = 0.0;     ...
Referencia al objeto actualC#  class Complejo {      private double Real = 0.0;      private double Imag = 0.0;      publ...
HerenciaC++                           class Carro {                                   private:                           ...
HerenciaC++ class A {                                       En     private: int A1;                Dentro    Deriva- Fuer...
HerenciaC++ class A {                                        En     private: int A1;                 Dentro    Deriva- Fu...
HerenciaC++ class A {                                       En     private: int A1;                Dentro    Deriva- Fuer...
HerenciaC++  class B1 {                               class B2 {      private: int IB1;                        private: i...
HerenciaC++  class B1 {                          class B2 {      public: int B;                      public: int B;      ...
HerenciaC++ class Cb { public: int I; }; class Cd1 : public Cb { }; class Cd2 : public Cb { }; class Chm : public Cd1, pu...
HerenciaJava                          class Carro {Constructor clase Base                              private int Mod = ...
HerenciaJava class A {                                          B UnB = new B(1, -1);     public int I;                  ...
HerenciaJava public interface VideoClip {                    Representa una interfaz    void Play( );    void Stop( );   ...
HerenciaJava  interface Interfaz1 {                                           NOTA: Aunque Java no      public void Print...
HerenciaC#                          class Carro {Constructor clase Base                              private int Mod = 0,...
HerenciaC# class A {                  Permite indicar que      B UnB = new B(1, -1);     public int I;            es un e...
HerenciaC#                                                Representa una interfaz public interface VideoClip {    int Fra...
HerenciaC# interface Interfaz1 {                  NOTA: Aunque C# no     void Print1( );                          soporta...
Clases abstractas y métodos virtualesC++            class Graphics {Método          public:virtual            virtual voi...
Clases abstractas y métodos virtualesJava Clase      abstract class Graphics {abstracta      public void DrawL(int x1, in...
Clases abstractas y métodos virtualesC# Clase      abstract class Graphics {abstracta      public void DrawL(int x1, int ...
Clases abstractas y métodos virtualesC#  class A {      public virtual void F1(void) { … }      public virtual void F2(vo...
PaquetesC++                                Declaración e inicio del espacio de  namespace MiPaquete {                    ...
PaquetesC++                                         Permite definir nombres  namespace Nuevo = MiPaquete;          altern...
PaquetesJava                                Indica que las clases definidas en este package MiPaquete;                   ...
PaquetesC#                               Indica que este archivo fuente hace uso  using Paquete1;                        ...
Otros ConceptosC++ - Funciones y Clases amigas • Las funciones amigas son funciones que están definidas   fuera del conte...
Otros ConceptosC++ - Funciones y Clases amigas • Su utilidad es discutible. Concepto poco elegante desde   el punto de vi...
Otros ConceptosC++ - Funciones y Clases amigas  class Date;   // Indica que existe una clase Date ya definida o a definir...
Otros ConceptosC++ - Funciones y Clases amigas  // Definición del constructor de forma “outline”  Time::Time(char *Tm) { ...
Otros ConceptosC++ - Plantillas de funciones y clases • Las plantillas de funciones permiten definir funciones   genérica...
Otros ConceptosC++ - Plantillas de funciones y clases • Es útil para escribir programas genéricos con menos   código. Des...
Otros ConceptosC++ - Plantillas de funciones y clases  template <class T>             // Definición de la plantilla  T Ge...
Otros ConceptosC++ - Plantillas de funciones y clases  template <class T>              // Definición de la plantilla  cla...
Otros ConceptosC++ - Plantillas de funciones y clases  template <class T>  class Par {         T v1, v2;      public:    ...
Otros ConceptosC++ - Plantillas de funciones y clases  // Algunos ejemplos del uso de plantillas  //  template <class T> ...
Otros ConceptosC++ - Conversión avanzada de clases • reinterpret_cast: convierte un apuntador a otro tipo de   apuntador....
Otros ConceptosC++ - Conversión avanzada de clases • static_cast: ejecuta cualquier conversión que puede ser   realizada ...
Otros ConceptosC++ - Conversión avanzada de clases • dynamic_cast: similar a static_cast con la diferencia   que se hace ...
Otros ConceptosC++ - Conversión avanzada de clases • const_cast: manipula los atributos de tipo constante del   objeto a ...
Otros ConceptosJava – Clases y métodos finales • Una clase final es aquella que no puede ser derivada.   No puede ser usa...
Otros ConceptosJava – Clases y métodos finales  public final class C1 {            // Define una clase final     …  }  pu...
Otros ConceptosC# – Clases y métodos finales • Una clase final es aquella que no puede ser derivada.   No puede ser usada...
Otros ConceptosC# – Clases y métodos finales  public sealed class C1 {                // Define una clase final     …  } ...
Otros ConceptosC# – Constructor estático • Permite definir un constructor para la clase, que se   invoca una sola vez y s...
Otros ConceptosC# – Constructor estático  class Rectangulo {      static bool Edo = false;   // Atributo estático      … ...
Otros ConceptosC# – Indexadores • Representa un operador para indexar un conjunto de   atributos de la clase. • Es una me...
Otros ConceptosC# – Indexadores  class VentasMes {      int[ ] producto1 = new int[12];     // Definición de arreglos    ...
Otros ConceptosC# – Clases anidadas • Permite definir clases auxiliares que se desean   mantener escondidas. • La clase i...
Otros ConceptosC# – Clases anidadas  class A {      int x;      B b = new B(this);              // Objeto de la clase ani...
Otros ConceptosC# – Operaciones de conversión entre clases  class A { … }                  A a = new C( ); // Ok  class B...
Otros ConceptosC# – Delegados y eventos • Delegado: método para recibir y procesar eventos;   patrón que describe el aspe...
Otros ConceptosC# – Delegados y eventos • Las implementaciones de control de eventos pueden   tener cualquier nombre de m...
Otros ConceptosC# – Delegados y eventos  delegate void Notificador(string Enviador); // Declaración de un tipo           ...
Otros ConceptosC# – Atributos • Permiten incluir directivas en las clases y en sus   miembros para mejorar su declaración...
Otros ConceptosC# – Atributos • Los atributos se escriben entre corchetes y debe   aparecer antes de la declaración en la...
Otros ConceptosC# – Atributos • Al atributo se puede anteponer un modificador que   defina el elemento al que se aplica e...
Otros ConceptosC# – Atributos • Para escribir clases de atributos propias para definir   atributos personalizados, hay qu...
Otros ConceptosC# – Atributos • Los atributos también pueden ser clases derivadas de la   clase “Attribute”.  // Ejemplo:...
Próxima SlideShare
Cargando en…5
×

Programacion oo

817 visualizaciones

Publicado el

Tecnología Orientada a Objetos - UNEG - Profesor Mauricio Paletta

1 comentario
2 recomendaciones
Estadísticas
Notas
Sin descargas
Visualizaciones
Visualizaciones totales
817
En SlideShare
0
De insertados
0
Número de insertados
3
Acciones
Compartido
0
Descargas
39
Comentarios
1
Recomendaciones
2
Insertados 0
No insertados

No hay notas en la diapositiva.

Programacion oo

  1. 1. PresentaciónProgramación Orientada a Objetos Ing. Mauricio Paletta, Msc INGENIERÍA EN INFORMÁTICA Programación II UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA Programación II
  2. 2. Programación Orientada a Objetos• ¿Cómo llevar a código todos los conceptos, principios y términos técnicos de la orientación a objetos?• Lenguajes de programación más populares: C++, Java y C#.• Hay lenguajes puros (casados con los conceptos de OO), e híbridos (permiten hacer cosas no OO).• Es importante evaluar la plataforma de desarrollo a utilizar basado en: entorno operativo, amigabilidad, soporte, tiempo de compilación, biblioteca de clases predefinida, costo (adquisición, instalación, mantenimiento, etc.), experiencia, etc. Programación II
  3. 3. Programación Orientada a Objetos• Algunas sugerencias: Microsoft Visual Studio, Borland Delphi 2005, Borland BuilderX, Borland Enterprise Studio.• Usar un lenguaje orientado a objetos no necesariamente implica hacer programación orientada a objetos. La clave está en respetar los principios. Programación II
  4. 4. Programación Orientada a ObjetosC++ • Compilado => permite generar programas ejecutables. • No es puro porque viene del lenguaje C y mantiene todos los conceptos no orientado a objetos de C. • Bajo nivel de portabilidad, alta dependencia en la plataforma operativa. • Sintaxis simple y semántica compleja. • Muy rico conceptualmente en lo que a orientación a objetos se refiere (manejo de herencia múltiple y sobrecarga de operadores por ejemplo). • Extensión de los archivos de código fuente: “cpp”. Programación II
  5. 5. Programación Orientada a ObjetosJava • Pseudo-interpretado (Java bytecode) se requiere un motor o máquina de ejecución para correr los programas. • Es puro desde el punto de vista de orientación a objetos. • Alto nivel de portabilidad, los programas pueden correr donde haya una máquina de ejecución. • Sintaxis y semántica simple. • No se permite ni la herencia múltiple directa ni la sobrecarga de operadores. • Extensión de los archivos de código fuente: “java”. • Extensión de los archivos Pseudo-compilados: “class”. Programación II
  6. 6. Programación Orientada a ObjetosC# • 70% Java, 10% C++, 5% Visual Basic, 15% cosas nuevas. • Pseudo-interpretado (Microsoft Intermediate Language - MSIL) se requiere un motor o máquina de ejecución para correr los programas. • Es puro desde el punto de vista de orientación a objetos. • Alto nivel de portabilidad, los programas pueden correr donde haya una máquina de ejecución. • Sintaxis y semántica medianamente complejas. • No se permite la herencia múltiple directa. • Extensión de los archivos de código fuente: “cs”. Programación II
  7. 7. Definición de Clases C++ Identificador de Indica definición la clase Comienza la de una clase class Complejo { definición de la private: clase double Real, Imag; Atributos Declarativas para public:definir la interfaz de double ObtReal(void) { los elementos return Real; } double ObtImag(void) { Métodos return Imag; } Termina la }; definición de la Instanciación de objetos opcional clase Programación II
  8. 8. Definición de ClasesC++ • Las declarativas de interfaz pueden aparecer más de una vez y en cualquier orden. Si no se indica nada es privada por defecto. • El cuerpo de los métodos se puede definir tanto dentro (inline) como fuera (outline) de la definición de la clase. Hay una diferencia en la llamada del mensaje o ejecución del método: inline se hace una copia fiel del código del cuerpo del método; código más rápido pero más grande outline se agrega una referencia donde se encuentra el código del cuerpo del método; código más lento pero más pequeño Programación II
  9. 9. Definición de ClasesC++ Indica relación de dependencia con una clase class Complejo { double Complejo::ObtReal(void) double Real; { public: return Real; double ObtReal(void); } private: double Imag; double Complejo::ObtImag(void) public: { double ObtImag(void); return Imag; }; } El cuerpo del método no está aquí Programación II
  10. 10. Definición de ClasesC++ • El cuerpo de los métodos inline debe ser simple, sin estructuras de control complejas (ciclos, ruptura, condicionales múltiples). • Se puede forzar la declaración de los métodos inline fuera de la definición de la clase. Permite mantener las ventajas de los métodos inline escondiendo el código a terceros. Programación II
  11. 11. Definición de ClasesC++ inline double Complejo::ObtReal(void) { return Real; } inline double Complejo::ObtImag(void) { return Imag; } Programación II
  12. 12. Definición de Clases Java / C# Identificador de Indica definición la clase Comienza la de una clase class Complejo { definición de la private double Real, Imag; clase public double ObtReal( ) { Atributos Declarativas para return Real;definir la interfaz de } los elementos public double ObtImag( ) { Métodos return Imag; } } Termina la definición de la clase Programación II
  13. 13. Definición de ClasesJava • Las declarativas de interfaz pueden aparecer más de una vez y en cualquier orden. Si no se indica nada se asume una interfaz entre privada y protegida. Privada porque no permite la visibilidad del elemento para las clases derivadas; protegida porque permite la visibilidad en todas las clases del mismo paquete. • El cuerpo de los métodos siempre debe ser definido dentro de la definición de la clase. • Todos los elementos de una clase están declarados y definidos dentro de la clase. Programación II
  14. 14. Definición de ClasesC# • Las declarativas de interfaz pueden aparecer más de una vez y en cualquier orden. Si no se indica nada es privada por defecto. • El cuerpo de los métodos siempre debe ser definido dentro de la definición de la clase. • Todos los elementos de una clase están declarados y definidos dentro de la clase. • Se maneja el concepto de atributos en la cual es posible esconder el manejo de los métodos de lectura (get) y asignación (set) de cada uno de los atributos de la clase. Programación II
  15. 15. Definición de ClasesC# Se puede acceder class Complejo { al atributo privado private double Real, Imag; Real mediante este elemento público. public double ParteReal {Usado para indicar Para los ojos del get {el retorno del valor usuario es como si return Real; del atributo fuera un atributo } pero realmente es } un método. Se puede usar public double ParteImag { también la get { sentencia set para return Imag;indicar las acciones } a tomar con la } modificación del } valor del atributo Programación II
  16. 16. Instanciación de ObjetosC++ Instancias u objetos (instanciación estática) No es un objeto Identificador sino un apuntador o de la Clase dirección de memoria Complejo C1, C2, *pC; pC = new Complejo; Instanciación dinámica haciendo uso del apuntador … delete pC; Liberación del espacio creado de forma dinámica. Debe ser hecho por el programador Programación II
  17. 17. Instanciación de ObjetosJava Identificador de la Clase Instancia u objeto Complejo C1 = new Complejo( ); NOTAS: - No existe el concepto de apuntador o dirección de memoria. - El proceso de instanciación es siempre dinámico. - La liberación o recuperación de memoria es automático y realizado por el motor de ejecución (no existe un operador delete). Programación II
  18. 18. Instanciación de ObjetosC# Identificador de la Clase Instancia u objeto Complejo C1 = new Complejo( ); NOTAS: - Sólo se permiten apuntadores o direcciones de memoria de tipos primitivos, no estructuras complejas como el caso de clases. - El proceso de instanciación es siempre dinámico. - La liberación o recuperación de memoria es automático y realizado por el motor de ejecución (no existe un operador delete). Programación II
  19. 19. Acceso a Elementos de la ClaseC++ Complejo C, *pC = new Complejo; Operador para double d = C.ObtReal( ); acceder a los Llamadas de mensajes elementos del pCObtImag( ); o ejecución de objeto métodos (*pC).ObtImag( );Operador para acceder a los elementos El contenido de ladel objeto a partir de un apuntador a la dirección de memoria es un dirección de memoria del mismo objetoNOTA: Recordar que los permisos de acceso a los elementos están regidos por la interfaz asociada en la definición de la clase. Programación II
  20. 20. Acceso a Elementos de la ClaseJava / C# Complejo C = new Complejo( ); double d = C.ObtReal( ); Operador para Llamada de mensaje o acceder a los ejecución del método elementos del objetoNOTA: Recordar que los permisos de acceso a los elementos están regidos por la interfaz asociada en la definición de la clase. Programación II
  21. 21. Acceso a Elementos de la ClaseC# Complejo C = new Complejo( ); double d = C.ParteReal; Operador para Acceso al atributo acceder a los público (llamada elementos del automática al mensaje objeto get asociada al atributo) Programación II
  22. 22. Constructor• Basado en el principio de persistencia.• Es un método particular que es ejecutado automáticamente durante la instanciación del objeto (tanto estática como dinámicamente).• Es útil para definir el estado inicial del objeto y realizar otras inicializaciones necesarias.• Como método/operación tiene las siguientes características: o Es opcional. o Debe ser público. o Se identifica de la misma forma como se identifica la clase. o No se le especifica tipo de retorno. o Puede tener cualquier número de parámetros. Programación II
  23. 23. ConstructorC++ class Complejo { private: No está permitido la double Real, Imag; inicialización de variables en este contexto public: Complejo(void) { Un constructor para la Real = Imag = 0.0; clase } double ObtReal(void) { NOTA: Si no se return Real; especifica un } constructor la data double ObtImag(void) { del objeto queda return Imag; sin inicializar } (embasurada). }; Programación II
  24. 24. ConstructorJava / C# class Complejo { Se permite la inicialización private double Real = 0.0; de elementos en este private double Imag = 0.0; contexto public Complejo( ) { Un constructor Real = Imag = 0.0; para la clase } public double ObtReal( ) { NOTA: Si no se especifica un return Real; constructor para la clase, } se asume uno por defecto public double ObtImag( ) { que no tiene parámetros y return Imag; que inicializa todos los } atributos en los literales } nulos correspondientes (0, false, „0‟, null, etc.) Programación II
  25. 25. Polimorfismo• Basado en el principio que lleva el mismo nombre.• Definir dos o más métodos con el mismo nombre, tipo de retorno e interfaz, pero diferente descripción de parámetros (cantidad y/o tipo de los mismos). Los parámetros determinan el contexto.• No hay límite sobre la cantidad de métodos definidos de forma polimórfica.• No es una redefinición, cada método se trata de forma independiente (declaración, definición y llamada).• Un caso particular es hacer polimorfismo sobre el constructor. Permite dar al usuario diferentes formas de inicializar un objeto durante la instanciación del mismo. Programación II
  26. 26. PolimorfismoC++ class Complejo { private: double Real, Imag; public: Complejo(void) { Real = Imag = 0.0; Polimorfismo } sobre el Complejo(double R, double I) { constructor Real = R, Imag = I; } … } C1, C2(1.0, -1.0); Dos objetos instanciados cada uno de los cuales llama a un constructor diferente Programación II
  27. 27. PolimorfismoJava / C# class Complejo { private double Real = 0.0; private double Imag = 0.0; public Complejo( ) { Real = Imag = 0.0; Polimorfismo } sobre el public Complejo(double R, double I ) { constructor Real = R; Imag = I; } … } Dos objetos instancia- … dos cada uno de los Complejo C1 = new Complejo( ), cuales llama a un C2 = new Complejo(1.0, -1.0); constructor diferente Programación II
  28. 28. Inicialización por defecto• Permite especificar un valor inicial por defecto a los parámetros de un método para los casos en los cuales el usuario obvia el parámetro.• Da al usuario la idea de que los parámetros son opcionales.• Cuando hay más de un parámetro, el orden de asignación entre el valor por defecto y el parámetro es de izquierda a derecha. No pueden haber saltos en esta relación de asignación.• Es útil para reducir el número de métodos de la clase (simplificar el uso del polimorfismo).• Es válido para cualquier método, en particular para los constructores. Programación II
  29. 29. Inicialización por defectoC++ class Complejo { private: double Real, Imag; public: Complejo(double R = 0.0, double I = 0.0) { Real = R, Imag = I; } … } C1, C2(1.0, -1.0), C3(1.0); Valor por defecto del parámetroTres objetos instanciados, todos hacen la llamada al mismo constructor Programación II
  30. 30. Inicialización por defectoC++ class Complejo { … public: Complejo(double = 0.0, double = 0.0); … }; … Complejo::Complejo(double R, double I) { Real = R; Imag = I; }NOTA: Cuando el cuerpo del constructor está fuera de la definición de la clase, las inicializaciones por defecto se especifican dentro de la clase en la declaración del método y no en su definición. Programación II
  31. 31. Inicialización por defectoJava / C# • Concepto no soportado en estos lenguajes. • Se permite inicialización de elementos en definición de la clase. class Complejo { private double Real = 0.0; Inicialización de private double Imag = 0.0; elementos public Complejo(double R, double I ) { Real = R; Imag = I; } … Es un error porque no } se puede resolver con … el constructor existente Complejo C = new Complejo( ); Programación II
  32. 32. Destructor• Basado en el principio de persistencia.• Es un método particular que es ejecutado automáticamente durante la destrucción o pérdida de alcance del objeto (tanto estática como dinámicamente).• Es útil para realizar código necesario cuando el objeto ya no va a ser mas utilizado, como por ejemplo la liberación o recuperación de espacios de memoria.• No aplica en lenguajes con recuperación automática de memoria. Programación II
  33. 33. Destructor• Como método/operación tiene las siguientes características: o Es opcional. o Debe ser público. o No se le especifica tipo de retorno. o No tiene parámetros. Programación II
  34. 34. DestructorC++ class Complejo { private:El destructor se llama double Real, Imag;igual que la clase pero con el prefijo ~ public: Complejo(double R = 0.0, double I = 0.0) { Real = R, Imag = I;Expresa que el método }tiene un cuerpo vacío ~Complejo(void) { } o no tiene código … asociado };NOTA: La destrucción ocurre cuando el objeto pierde su alcance de vida. En el caso de la instanciación dinámica, esto ocurre cuando se hace la operación delete Programación II
  35. 35. DestructorJava protected void finalize( ) { … Se puede redefinir el método } finalize para que sea llamado de forma automática por el algoritmo de recuperación de memoria NOTA: No soporta el concepto de destructores por el algoritmo de recuperación automática de memoria. Se recomienda no usar finalize y dejar todo el trabajo al motor de ejecución. Programación II
  36. 36. DestructorC# class Complejo { Al igual que Java, se puede … redefinir el método Finalize void Finalize( ) { para que sea llamado de forma … automática por el algoritmo de } recuperación de memoria } class Complejo { También soporta la misma sintaxis … de C++ y tener un método que se ~Complejo( ) { llama igual que la clase con el … prefijo ~. Este método y la } redefinición de Finalize no pueden } convivir en la misma clase Programación II
  37. 37. Elementos estáticos• Basado en el principio de concurrencia.• Permite que todos los objetos instanciados de una misma clase y que están activos en un mismo instante, compartan la misma información asociada a uno o varios de sus atributos y/o compartan el mismo código asociado a uno o varios de sus métodos.• La idea es forzar a todos los objetos a ver / usar el mismo elemento. Programación II
  38. 38. Elementos estáticos• Un ejemplo típico de Java / C#, es el caso particular del método que representa el programa principal (main / Main); este debe ser estático porque no tiene sentido dos instancias de objetos cada uno de los cuales con un programa principal de ejecución; todas las instancias comparten el mismo método. Programación II
  39. 39. Elementos estáticosC++ Indica que class String; String es una class File { clase cuya private: definición seAtributo static int NumAbiertos; encontraráestático public: mas adelante File(const String &, const String &); File(const File &);Destructor ~File(void); Indica pasaje static int Abiertos(void) { de parámetro return NumAbiertos; por referencia } … Método }; estático Programación II
  40. 40. Elementos estáticosC++ Asignación del valor inicial al atributo int File::NumAbiertos = 0; estático, nótese que está fuera de la File::File(const String &N, const String &M) { definición de la clase … NumAbiertos++; } File::~File(void) { … Constructor y NumAbiertos--; destructor definidos } fuera de la definición … de la clase Programación II
  41. 41. Elementos estáticosJava La clase que contiene public class Ejemplo { el programa principal debe ser pública static int NumInstancias = 0; public static int Instancias( ) { Atributo estático con su return NumInstancias; inicialización } Método estático public Ejemplo( ) { NumInstancias++; Para tomar los posibles } argumentos del public static void main(String args[ ]) { programa principal … } Para definir el código } del programa principal Programación II
  42. 42. Elementos estáticosC# La clase que contiene public class Ejemplo { el programa principal debe ser pública static int NumInstancias = 0; public static int Instancias( ) { Atributo estático con su return NumInstancias; inicialización } Método estático public Ejemplo( ) { NumInstancias++; Para tomar los posibles } argumentos del public static void Main(string args[ ]) { programa principal … } Para definir el código } del programa principal Programación II
  43. 43. Operador de Asignación o Copia• Los lenguajes orientados a objetos manejan internamente el uso del operador natural de asignación cuando es aplicado sobre una instancia u objeto.• El efecto es copiar el contenido de la memoria que corresponde a los atributos de la expresión que resulta del lado derecho de la asignación, en el espacio de memoria equivalente del objeto que recibe el valor en el lado izquierdo de la operación.• Hay que tener cuidado con direcciones de memoria o uso de apuntadores como atributos (si aplica en el lenguaje). Programación II
  44. 44. Operador de Asignación o Copia• Los lenguajes que soportan la sobrecarga de operadores pueden dar su propia definición del operador de asignación y así evitar problemas como el caso anterior.• En algunos lenguajes se realiza una llamada indirecta al constructor cuando el contexto es claro. Programación II
  45. 45. Operador de Asignación o CopiaC++ Construcción indirecta Complejo C1(2.5, -1.0), C2 = C1, C3 = 1.0; de una instancia para resolver la operaciónJava / C# Complejo C1 = new Complejo(2.5, -1.0), C2 = C1; Uso del operador de asignación entre objetos Complejo C1 = new Complejo(2.5, -1.0), C2 = new Complejo( ); … C2 = C1; Programación II
  46. 46. Sobrecarga de Operadores• Basado en el principio de polimorfismo.• Permite escribir una implementación propia sobre el uso de un símbolo predeterminado, usado por el lenguaje para representar operaciones sobre elementos primitivos.• Ejemplo: Para representar la suma de dos objetos C1 y C2 de tipo Complejo y guardar el resultado en el Complejo C3, es más elegante hacer C3 = C1 + C2 que hacer C3 = C1.Suma(C2) ó C3 = Suma(C1, C2) Programación II
  47. 47. Sobrecarga de OperadoresC++ • Se pueden sobrecargar los siguientes operadores: o Aritméticos: +, -, *, /, %, ++, --, +=, -=, *=, /=, %=. o Asignación: =. o Relacionales: >, <, >=, <=, ==, !=. o Manejo de bits: &, |, ^, >>, <<, ~, &=, |=, ^=, >>=, <<=. o Lógicos: &&, ||, !. o Conversión de tipos (casting): ( ) o Direccionamiento de arreglos: [ ] o Manejo dinámico de memoria: new, delete. Programación II
  48. 48. Sobrecarga de OperadoresC++ • No es posible modificar la asociatividad del operador y tampoco la semántica de interpretación (por ejemplo, los operadores de relación deben retornar un valor lógico válido). Programación II
  49. 49. Sobrecarga de OperadoresC++ class Complejo { private: double Real, Imag; public: … // Sobrecarga de un operador binario asociativo Complejo &operator +(Complejo &C) { return *new Complejo(Real + C.Real, Imag + C.Imag); } … } C1, C2(5.0, -1.0), C3(2.5); … C1 = C2 + C3; // Llamada del mensaje Programación II
  50. 50. Sobrecarga de OperadoresC++ class Complejo { private: double Real, Imag; public: … operator double( ) { // Sobrecarga de un operador return Real; // unario de conversión de tipo } … } C(5.0, -1.0); … double d = (double)C; // Llamada del mensaje Programación II
  51. 51. Sobrecarga de OperadoresJava class Complejo { private double Real = 0.0; private double Imag = 0.0; … public Complejo Suma(Complejo C) { return new Complejo(Real + C.Real, Imag + C.Imag); } … } … Complejo C1 = new Complejo(1.0, -1.0), C2 = new Complejo(5.0, 2.5), C3 = C1.Suma(C2); NOTA: No soporta la sobrecarga de operadores. Programación II
  52. 52. Sobrecarga de OperadoresC# • Se pueden sobrecargar los siguientes operadores: o Aritméticos: +, -, *, /, %, ++, --. o Relacionales: >, <, >=, <=, ==, !=. o Manejo de bits: &, |, ^, >>, <<, ~. o Lógicos: !, true, false. o Conversión de tipos (casting): ( ) Programación II
  53. 53. Sobrecarga de OperadoresC# • Al sobrecargar un operador binario op, también se sobrecarga el operador de asignación correspondiente op=, si lo posee. • El direccionamiento de arreglos [ ] no se considera como una sobrecarga. Se maneja haciendo uso del concepto de “indexadores” (indexer). Programación II
  54. 54. Sobrecarga de OperadoresC# class Complejo { private double Real = 0.0; private double Imag = 0.0; … public static Complejo operator +(Complejo C1, Complejo C2) { return new Complejo(C1.Real + C2.Real, C1.Imag + C2.Imag); } … } … Complejo C1 = new Complejo(1.0, -1.0), C2 = new Complejo(5.0, 2.5), C3 = C1 + C2; NOTA: Deben ser obligatoriamente métodos públicos y estáticos. Programación II
  55. 55. Sobrecarga de OperadoresC# class Complejo { … public static explicit operator double(Complejo C) { return C.Real; } public static implicit operator Complejo(double d) { Complejo C = new Complejo(d, 0.0); return C; } … } … Complejo C = 1.0; // Conversión implícita double d = (double)C; // Conversión explícita Programación II
  56. 56. Referencia al objeto actual• Variable predefinida que permite al programador hacer referencia al objeto actualmente instanciado. Para los tres lenguajes en estudio la variable se identifica como this.• Es útil cuando en el cuerpo de un método se hace referencia a un elemento de la clase con más de una instancia, incluyendo la actual y se quiere representar la diferencia.• Para los lenguajes que permiten la sobrecarga de operadores, es útil para retornar la instancia actual cuando el operador es unario y asociativo.• En C++, this es un apuntador por lo que se debe usar con el operador . Programación II
  57. 57. Referencia al objeto actual• En Java, this se puede usar como una función dentro de un constructor para hacer una llamada de otro constructor de la misma clase. Programación II
  58. 58. Referencia al objeto actualC++ class Complejo { … public: … Complejo &operator ++(void) { // Operador unario *this = *this + Complejo(1.0, 1.0); // asociativo con return *this; // modificación del } // estado del objeto … // que hace la llamada } C(5.0, -1.0); … (++C)++; // Ejecución del operador dos veces, la primera vez // como prefijo y la segunda como postfijo Programación II
  59. 59. Referencia al objeto actualJava class Complejo { private double Real = 0.0; private double Imag = 0.0; public Complejo(double R, double I ) { Real = R; Imag = I; } public Complejo( ) { this(0.0, 0.0); // Llamada al primer constructor } public Complejo Suma(Complejo C) { return new Complejo(this.Real + C.Real, this.Imag + C.Imag); } … } Programación II
  60. 60. Referencia al objeto actualC# class Complejo { private double Real = 0.0; private double Imag = 0.0; public Complejo(double R, double I) { Real = R; Imag = I; } public Complejo(Complejo C) { this.Real = C.Real; this.Imag = C.Imag; } … } … Complejo C1 = new Complejo(1.0, 1.0), C2 = new Complejo(C1); Programación II
  61. 61. HerenciaC++ class Carro { private: int Mod, Cap;Constructor clase Base public: Carro(int M = 0, int C = 0) { … } …Interfaz de la herencia };(¿Cómo serán vistos en clase Operador de Derivada los elementos class Carga : public Carro { relación entre públicos de la clase Base?) private: clase Base y int CapCarga; clase Derivada public: Constructor clase Carga(int M = 0, int C = 0, int P = 0) : Derivada Carro(M, C) { … } … Llamada al constructor }; de la clase Base Programación II
  62. 62. HerenciaC++ class A { En private: int A1; Dentro Deriva- Fuera de protected: int A2; de B das de B B public: int A3; A1 }; A2 class B : private A { A3 private: int B1; protected: int B2; B1 public: int B3; B2 }; B3 Programación II
  63. 63. HerenciaC++ class A { En private: int A1; Dentro Deriva- Fuera de protected: int A2; de C das de C C public: int A3; A1 }; A2 class C : protected A { A3 private: int C1; protected: int C2; C1 public: int C3; C2 }; C3 Programación II
  64. 64. HerenciaC++ class A { En private: int A1; Dentro Deriva- Fuera de protected: int A2; de D das de D D public: int A3; A1 }; A2 class D : public A { A3 private: int D1; protected: int D2; D1 public: int D3; D2 }; D3 Programación II
  65. 65. HerenciaC++ class B1 { class B2 { private: int IB1; private: int IB2; public: public: B1(int I = 0) { IB1 = I; } B2(int I = 0) { IB2 = I; } … … }; }; Herencia múltiple class D : public B1, public B2 { public: D(int I1 = 0, int I2 = 0) : B1(I1), B2(I2) { }; … }; Constructores de clases Base Programación II
  66. 66. HerenciaC++ class B1 { class B2 { public: int B; public: int B; … … }; }; class D : public B1, public B2 { Operador que public: int B; indica búsqueda … sobre un contexto superior } UnD; (en la jerarquía) … al actual UnD.B = 0; // Acceso al elemento B de D UnD.B1::B = 0; // Acceso al elemento B de B1 UnD.B2::B = 0; // Acceso al elemento B de B2 Programación II
  67. 67. HerenciaC++ class Cb { public: int I; }; class Cd1 : public Cb { }; class Cd2 : public Cb { }; class Chm : public Cd1, public Cd2 { }; … Chm hm; hm.Cd1::I = 1; hm.Cd2::I = 2; // Cada I es independiente cout << hm.Cd1::I << n << hm.Cd2::I; // La salida es: 1 2 class Cb { public: int I; }; class Cd1 : public virtual Cb { }; class Cd2 : public virtual Cb { }; class Chm : public Cd1, public Cd2 { }; … Chm hm; hm.Cd1::I = 1; hm.Cd2::I = 2; // I es compartido (el mismo) cout << hm.Cd1::I << n << hm.Cd2::I; // La salida es: 2 2 Programación II
  68. 68. HerenciaJava class Carro {Constructor clase Base private int Mod = 0, Cap = 0; public Carro(int M, int C) { … } Indica herencia … } Constructor clase class Carga extends Carro { Derivada private int CapCarga = 0; public Carga(int M, int C, int P) { super(M, C); … Llamada al constructor } de la clase Base … } Programación II
  69. 69. HerenciaJava class A { B UnB = new B(1, -1); public int I; // Acceso al elemento I … // de B. } // class B extends A { UnB.I++; public int I; // No es posible acceder public B(int I1, int I2) { // al elemento I de A con I = I1; // Acceso al elemento I de B // la instancia UnB, no // (equivalente a usar this.I) // hay forma de resolver A.I = I2; // Acceso al elemento I de A // la ambigüedad con el } // elemento I entre la … // clase base A y la clase } // derivada B Programación II
  70. 70. HerenciaJava public interface VideoClip { Representa una interfaz void Play( ); void Stop( ); Métodos de la interfaz a } definir en otro lugar class MiClase implements VideoClip { Clase que implementa o void Play( ) { … } usa una interfaz void Stop( ) { … } Definición de los … métodos de la interfaz } NOTA: Una interface en Java representa un conjunto de métodos cuya definición (implementación) está en otro lugar (concepto parecido a los métodos virtuales pero sin usar la herencia). Programación II
  71. 71. HerenciaJava interface Interfaz1 { NOTA: Aunque Java no public void Print1( ); soporta la herencia } múltiple, el uso de interface Interfaz2 { interfaces represen- public void Print2( ); ta un truco para } hacer algo parecido class Superclase { protected String S = “Ejemplo”; } class Subclase extends Superclase implements Interfaz1, Interfaz2 { public void Print1( ) { System.out.println(S); } public void Print2( ) { System.out.println(“Por Interfaz 2”); } } Programación II
  72. 72. HerenciaC# class Carro {Constructor clase Base private int Mod = 0, Cap = 0; public Carro(int M, int C) { … } Indica herencia … }; Constructor clase class Carga : Carro { Derivada private int CapCarga = 0; public Carga(int M, int C, int P) : base(M, C) { … Llamada al constructor } de la clase Base … } Programación II
  73. 73. HerenciaC# class A { Permite indicar que B UnB = new B(1, -1); public int I; es un elemento // Acceso al elemento I … nuevo y no se trata // de B. de una redefinición } // relativa a la clase base UnB.I++; class B : A { new public int I; // No es posible acceder public B(int I1, int I2) { // al elemento I de A con this.I = I1; // Elemento I de B // la instancia UnB, no base.I = I2; // Elemento I de A // hay forma de resolver } // la ambigüedad con el … // elemento I entre la } // clase base A y la clase // derivada B Programación II
  74. 74. HerenciaC# Representa una interfaz public interface VideoClip { int Frames { get; } Atributo de la interfaz a void Play( ); definir en otro lugar void Stop( ); Métodos de la interfaz a } definir en otro lugar class MiClase : VideoClip { Clase que implementa o public int Frames { get { … } } usa una interfaz public void Play( ) { … } public void Stop( ) { … } Definición de los … atributos y métodos de } la interfaz NOTA: Una interface en C# representa un conjunto de atributos (de C#) y métodos cuya definición (implementación) está en otro lugar. Programación II
  75. 75. HerenciaC# interface Interfaz1 { NOTA: Aunque C# no void Print1( ); soporta la herencia } múltiple, el uso de interface Interfaz2 { interfaces representa void Print2( ); un truco para hacer } algo parecido class Superclase { protected String S = “Ejemplo”; } class Subclase : Superclase, Interfaz1, Interfaz2 { public void Print1( ) { Console.WriteLine(S); } public void Print2( ) { Console.WriteLine(“Por Interfaz 2”); } } Programación II
  76. 76. Clases abstractas y métodos virtualesC++ class Graphics {Método public:virtual virtual void DrawL(int x1, int y1, int x2, int y2) { … } virtual double Area(void) = 0;Método …virtual }; puro class MyClass : public Graphics { Indica que la función no tiene unRedefini- public: cuerpo definido yción del double Area(void) { … } que debe ser hecho método … en las clases }; derivadas virtual NOTA: Una clase que tenga al menos un método virtual puro es una clase abstracta (no es posible crear instancias con ella). Programación II
  77. 77. Clases abstractas y métodos virtualesJava Clase abstract class Graphics {abstracta public void DrawL(int x1, int y1, int x2, int y2) { … }Método public abstract double Area(void);virtual … } No todos los class MyClass extends Graphics { métodos de unaRedefini- public double Area(void) { … } clase abstracta sonción del … virtuales método } virtual NOTA: Una clase que tenga al menos un método virtual debe ser declarada abstracta obligatoriamente. Programación II
  78. 78. Clases abstractas y métodos virtualesC# Clase abstract class Graphics {abstracta public void DrawL(int x1, int y1, int x2, int y2) { … }Método public abstract double Area(void);virtual … No todos los puro } métodos de una clase abstracta son class MyClass : Graphics { virtualesRedefini- public override double Area(void) {ción del … método } virtual … } NOTA: Una clase que tenga al menos un método virtual puro (método abstracto) debe ser declarada abstracta obligatoriamente. Programación II
  79. 79. Clases abstractas y métodos virtualesC# class A { public virtual void F1(void) { … } public virtual void F2(void) { … } Métodos virtuales public virtual void F3(void) { … } … } class B : A { public override void F1(void) { … } Redefinición del método F1 public new void F2(void) { … } Nueva versión del método F2 public new virtual F3(void) { … } Nueva versión del método F3 … y virtual para las clases } derivadas de B NOTA: Los métodos virtuales pueden ser redefinidos en clases derivadas; deben tener una definición válida (cuerpo) en la clase base. Programación II
  80. 80. PaquetesC++ Declaración e inicio del espacio de namespace MiPaquete { nombres o paquete class Clase1 { … }; Cualquier cosa definida dentro del … bloque del espacio de nombres } pertenece al paquete … int main(void) { MiPaquete::Clase1 Obj1; … Forma de acceder a los elementos } definidos dentro del paquete NOTA: Se hace uso del concepto conocido como “espacio de nombres”. Programación II
  81. 81. PaquetesC++ Permite definir nombres namespace Nuevo = MiPaquete; alternativos a paquetes ya … existentes int main(void) { Indica que los elementos using namespace Nuevo; usados en el bloque ocurrente, Clase1 Obj1; pueden pertenecer al paquete … indicado } NOTA: Cualquier cosa (variable, función, clase, estructura, macro, etc.) que se puede definir en el lenguaje en el contexto del programa principal, se puede colocar dentro de un espacio de nombres. Los espacios de nombre solo se definen en el mismo contexto del programa principal. Programación II
  82. 82. PaquetesJava Indica que las clases definidas en este package MiPaquete; archivo fuente pertenecen a este paquete import MiPaquete.Miclase; Indica que el archivo fuente actual va a usar la clase MiClase del paquete indicado import MiPaquete.*; Indica que el archivo fuente actual va a usar las clases definidas en el paquete indicado MiPaquete.MiClase Para hacer referencia a alguna de las clases del Paquete (permite resolver ambigüedades) NOTA: Un archivo fuente contiene la definición de una clase y el nombre de la clase y del archivo coinciden. Los nombres de los paquetes deben coincidir con directorios donde se encuentren los archivos fuente correspondientes. Solo aquellas clases que sean de interfaz pública pueden ser importadas de un paquete. Programación II
  83. 83. PaquetesC# Indica que este archivo fuente hace uso using Paquete1; del paquete indicado … namespace MiPaquete { Declaración e inicio del espacio de class Clase1 { nombres o paquete … Cualquier clase definida dentro del } bloque del espacio de nombres … pertenece al paquete } Para hacer referencia a alguna de las Paquete1.Clase1 clases del Paquete (permite resolver ambigüedades) NOTA: Se hace uso del concepto de espacio de nombres. Se pueden anidar entre sí. Programación II
  84. 84. Otros ConceptosC++ - Funciones y Clases amigas • Las funciones amigas son funciones que están definidas fuera del contexto de una clase y tienen permiso de acceder a los elementos privados de esa clase. • Una clase A es amiga de otra clase B cuando dentro de los métodos de A se puede acceder a los elementos privados de B. • Se utiliza la declarativa friend para indicar que una función o clase es amiga de una clase. La relación de amistad se declara dentro de la clase que permite la amistad. Programación II
  85. 85. Otros ConceptosC++ - Funciones y Clases amigas • Su utilidad es discutible. Concepto poco elegante desde el punto de vista de la orientación a objetos. Se puede evitar su uso con poco esfuerzo (basta por ejemplo, definir métodos públicos para acceder a elementos privados). Programación II
  86. 86. Otros ConceptosC++ - Funciones y Clases amigas class Date; // Indica que existe una clase Date ya definida o a definir class Time { private: long secs; friend char *gtime(Time); // gtime es una función amiga de Time friend class Date; // Date es una clase amiga de Time public: Time(char *); … }; NOTA: Una función o clase puede ser amiga de dos clases diferentes. Dos clases pueden ser amigas entre sí. Programación II
  87. 87. Otros ConceptosC++ - Funciones y Clases amigas // Definición del constructor de forma “outline” Time::Time(char *Tm) { char *Hr = strtok(Tm, “:”), *Mn = strtok(0, “:”); secs = atol(Hr) * 3600 + atol(Mn) * 60; // Acceso al elemento } // privado “secs” // Definición de la función gtime. Nótese que no pertenece a la clase char *gtime(Time x) { char *buffer = new char[10]; int h = x.secs / 3600, // Acceso al elemento privado m = (x.secs % 3600) / 60; // secs usando la instancia x sprintf(buffer, “%02d:%02d”, h, m); return buffer; } Programación II
  88. 88. Otros ConceptosC++ - Plantillas de funciones y clases • Las plantillas de funciones permiten definir funciones genéricas que admiten cualquier tipo de dato como parámetros sin necesidad de usar polimorfismo. Parecido a una macro. • Las plantillas de clases permiten definir clases cuyos elementos están basados en tipos genéricos que no deben ser definidos en el momento de su creación. • Se usa la declarativa template y la palabra reservada class ó typename (no hay diferencia entre una u otra). • UML soporta este concepto en su sintaxis. Programación II
  89. 89. Otros ConceptosC++ - Plantillas de funciones y clases • Es útil para escribir programas genéricos con menos código. Desde el punto de vista de la orientación a objetos es más elegante el uso del principio de Polimorfismo. Programación II
  90. 90. Otros ConceptosC++ - Plantillas de funciones y clases template <class T> // Definición de la plantilla T GetMax(T a, T b) { // de la función GetMax T res = (a > b) ? a : b; return res; } int main(void) { int i = 5, j = 6, k; long l = 10L, m = 5L, n; k = GetMax(i, j); // Uso de la plantilla con el tipo int n = GetMax(l, m); // Uso de la plantilla con el tipo long cout << k << n; return 0; } Programación II
  91. 91. Otros ConceptosC++ - Plantillas de funciones y clases template <class T> // Definición de la plantilla class Par { // de la clase Par private: T v1, v2; public: Par(T pri, T seg) { v1 = pri; v2 = seg; } T GetMax(void); }; template <class T> // Definición del método GetMax de Par T Par<T>::GetMax(void) { return v1 > v2 ? V1 : v2; } … Par <int> MiObjeto(100, 75); // Instanciación del objeto usando int Programación II
  92. 92. Otros ConceptosC++ - Plantillas de funciones y clases template <class T> class Par { T v1, v2; public: Par(T pri, T seg) { v1 = pri; v2 = seg; } T Modulo(void) { return 0 } }; template <> // Especialización de la plantilla Par class Par <int> { // usando el tipo int int v1, v2; public: Par(int pri, int seg) { v1 = pri; v2 = seg; } int Modulo(void) { return v1 % v2; } // Especialización de }; // la función Modulo Programación II
  93. 93. Otros ConceptosC++ - Plantillas de funciones y clases // Algunos ejemplos del uso de plantillas // template <class T> // La más usual: una clase como parámetro template <class T, class U> // Dos clases template <class T, int N> // Una clase y un tipo primitivo template <class T = char> // Con un valor por defecto template <int Tfunc(int)> // Una función como parámetro NOTA: Las plantillas son compiladas por demanda, es decir, el código de las plantillas de funciones no se compila hasta que no se tenga una instancia y el compilador conozca el tipo de dato que corresponde a esa instancia. Programación II
  94. 94. Otros ConceptosC++ - Conversión avanzada de clases • reinterpret_cast: convierte un apuntador a otro tipo de apuntador. No se hace ningún tipo de chequeo ni transforma-ción al contenido de lo apuntado. class A { } *a = new A; class B { } *b = reinterpret_cast <B *> (a); Programación II
  95. 95. Otros ConceptosC++ - Conversión avanzada de clases • static_cast: ejecuta cualquier conversión que puede ser realizada implícitamente de la misma forma que la conversión inversa (aún si no está permitida de forma implícita). class A { } *a = new A; class B : public A { } *b = static_cast <B *> (a); Programación II
  96. 96. Otros ConceptosC++ - Conversión avanzada de clases • dynamic_cast: similar a static_cast con la diferencia que se hace un chequeo de la validez de la operación (si la conversión retorna un objeto válido del tipo requerido). El chequeo es en tiempo de ejecución y si no es válido se retorna un valor nulo. class A { virtual dummy( ); }; class B : public A { }; A *a1 = new B; A *a2 = new A; B *b1 = dynamic_cast <B *>(a1); // Ok B *b2 = dynamic_cast <B *>(a2); // Falla  nulo B b3 = dynamic_cast <B &*>(a1); // Ok B b4 = dynamic_cast <B &*>(a2); // Excepción Programación II
  97. 97. Otros ConceptosC++ - Conversión avanzada de clases • const_cast: manipula los atributos de tipo constante del objeto a convertir, ya sea para ser agregados o removidos en el proceso de conversión. class C { }; const C *a = new C; C *b = const_cast <C *>(a); • typeid: operador que permite revisar el tipo resultante de una expresión. class A { } *a, b; if (typeid(a) == typeid(b)) … Programación II
  98. 98. Otros ConceptosJava – Clases y métodos finales • Una clase final es aquella que no puede ser derivada. No puede ser usada como clase base en una herencia. Permiten terminar una cadena de herencia. • Un método final es aquél que no puede ser redefinido en clases derivadas. Incluye la definición de elementos polimórficos. • Se usa la declarativa final. • Los errores se identifican en tiempo de compilación. Programación II
  99. 99. Otros ConceptosJava – Clases y métodos finales public final class C1 { // Define una clase final … } public class C2 extends C1 { // ERROR … } public class C3 { public final Metodo1( ) { … } // Define un método final … } public class C4 extends C3 { public Metodo1( ) { … } // ERROR } Programación II
  100. 100. Otros ConceptosC# – Clases y métodos finales • Una clase final es aquella que no puede ser derivada. No puede ser usada como clase base en una herencia. Permiten terminar una cadena de herencia. • Un método final es un método de una clase derivada que redefine uno equivalente de una clase base correspondiente y que no se desea sea más redefinido en otros niveles de herencia, si es el caso. • Se usa la declarativa sealed. • Los errores se identifican en tiempo de compilación. Programación II
  101. 101. Otros ConceptosC# – Clases y métodos finales public sealed class C1 { // Define una clase final … } public class C2 { public virtual void f( ) { … } // Método virtual … } public class C3 : C2 { public sealed override void f( ) { // Redefinición del método … // virtual y definido como final } … } Programación II
  102. 102. Otros ConceptosC# – Constructor estático • Permite definir un constructor para la clase, que se invoca una sola vez y sólo la primera vez que la clase es usada (la primera instanciación de la misma). • No puede tener parámetros. • No se le indica declarativa de interfaz. • Solo puede haber un constructor estático por clase. • No limita la existencia o definición de otros constructores no estáticos. • Al igual que otros métodos estáticos, solo puede acceder a miembros estáticos de la clase. • Se usa la declarativa static. Programación II
  103. 103. Otros ConceptosC# – Constructor estático class Rectangulo { static bool Edo = false; // Atributo estático … static Rectangulo( ) { // Constructor estático Console.WriteLine(“Clase Rectángulo Inicializada”); Edo = true; } public Rectangulo( ) { // Constructores no estáticos … } public Rectangulo(int w, int h) { … } } Programación II
  104. 104. Otros ConceptosC# – Indexadores • Representa un operador para indexar un conjunto de atributos de la clase. • Es una mezcla del manejo de atributos y arreglos. • Además de la declarativa de interfaz y el tipo de dato, se usa la palabra reservada this con una indicación del tipo de dato del índice encerrado entre corchetes (similar a la forma como de declaran los arreglos. • Como atributo se le pueden definir las operaciones get y set correspondientes. Programación II
  105. 105. Otros ConceptosC# – Indexadores class VentasMes { int[ ] producto1 = new int[12]; // Definición de arreglos int[ ] producto2 = new int[12]; public int this[int i] { // Indexador cuyo índice es un entero get { return producto1[i-1] + producto2[i-1]; } } public int this[string mes] { // Indexador cuyo índice es una cadena get { switch (mes) { case “Ene”: return producto1[0] + producto2[0]; … } } } … } Programación II
  106. 106. Otros ConceptosC# – Clases anidadas • Permite definir clases auxiliares que se desean mantener escondidas. • La clase interna puede acceder a todos los miembros de la clase externa, incluyendo los elementos privados. • La clase externa puede acceder solo a los miembros públicos de la clase interna. • Otras clases pueden acceder a la clase interna solo si ésta se define como pública. • El concepto de anidamiento también aplica a estructuras (struct), enumerados (enum), interfaces (interface) y delegados (delegate). Programación II
  107. 107. Otros ConceptosC# – Clases anidadas class A { int x; B b = new B(this); // Objeto de la clase anidada B public void f( ) { b.f( ); } // Acceso a miembro público de B public class B { // Clase anidada de A A a; public B(A a) { this.a = a; } public void f( ) {a.x = 1; a.f( ); } // Acceso a miembros de A } // tanto públicos como privados } class C { A a = new A; A.B b = new A.B(a); // Acceso a clase B fuera de A } Programación II
  108. 108. Otros ConceptosC# – Operaciones de conversión entre clases class A { … } A a = new C( ); // Ok class B : A { … } B b = (B)a; // Si (a is B) Ok class C : B { … } C c = (C)a; // sino Excepción A a; a = null; // Ok a = new A( ); c = (C)a; // Ok a = new B( ); // Ok A a = new C( ); // Ok a = new C( ); // Ok B b = a as B; // Si (a is B) b = (B)a B b = a; // ERROR C c = a as C; // sino b = null if (a is C) … // true a = null; if (a is B) … // true c = a as C // c == null if (a is A) … // true a = null; // Ok if (a is C) … // false Programación II
  109. 109. Otros ConceptosC# – Delegados y eventos • Delegado: método para recibir y procesar eventos; patrón que describe el aspecto que tiene un controlador específico de eventos; define lo que debe devolver el controlador de eventos del usuario y lo que debe ser la lista de parámetros. • Evento: medio con el cual se puede avisar de una condición. • Los métodos que necesitan procesar un evento deben obedecer las convenciones de llamada del delegado: no deben devolver ningún dato y deben tener una sola cadena como lista de parámetros. Programación II
  110. 110. Otros ConceptosC# – Delegados y eventos • Las implementaciones de control de eventos pueden tener cualquier nombre de método mientras su tipo devuelto y su lista de parámetros concuerdan con el patrón de delegados. Programación II
  111. 111. Otros ConceptosC# – Delegados y eventos delegate void Notificador(string Enviador); // Declaración de un tipo // delegado Notificador Saludos; // Una variable delegada void DiHola(string Enviador) { Console.WriteLine(“Hola desde ” + Enviador); } Saludos = new Notificador(DiHola); // Asignar un método // a la variable delegada Saludos(“Mauricio”); // Llamada del delegado // Declaración de un evento (variable delegada especial). Solo las clases // que declaran el evento lo pueden disparar (mejor abstracción) public event Notificador DiAlgo; Programación II
  112. 112. Otros ConceptosC# – Atributos • Permiten incluir directivas en las clases y en sus miembros para mejorar su declaración mediante información que es interpretada por otras clases en tiempo real. • Se pueden usar los atributos predefinidos en el lenguaje y los personalizados por el programador. Programación II
  113. 113. Otros ConceptosC# – Atributos • Los atributos se escriben entre corchetes y debe aparecer antes de la declaración en la que se debe aplicar: clases, miembros de la clase, estructuras, interfaces, miembros de la interfaz, enumeraciones, miembros de la enumeración y delegados. [MiAtributo] class MiClase { … } Programación II
  114. 114. Otros ConceptosC# – Atributos • Al atributo se puede anteponer un modificador que defina el elemento al que se aplica el atributo. Va seguido de dos puntos. Recibe el nombre de enlazar un atributo. [MiEnlace:MiAtributo] • Algunos atributos están construidos para aceptar parámetros. [MiAtributo(Parámetros)] Programación II
  115. 115. Otros ConceptosC# – Atributos • Para escribir clases de atributos propias para definir atributos personalizados, hay que derivar de la clase predefinida “Attribute” del espacio de nombre “System”. public class CodeAuthorAttribute : Attribute { … } [CodeAuthorAttribute] [CodeAuthor] // Todos los atributos cuyos nombres terminan con el sufijo Attribute, // se puede también usar como alias el nombre sin ese sufijo Programación II
  116. 116. Otros ConceptosC# – Atributos • Los atributos también pueden ser clases derivadas de la clase “Attribute”. // Ejemplo: Llamada a métodos extornos en DLL namespace System.Runtime.InteropServices { [AttributeUsage(AttributeTargets.Method)] public class DllImportAttribute : System.Attribute { public DllImportAttribute(string dllName) { … } public CallingConvention CallingConvention; public string EntryPoint; public bool SetLastError; … } } Programación II

×