SlideShare a Scribd company logo
1 of 116
Download to read offline
Presentación




Programación Orientada a Objetos

   Ing. Mauricio Paletta, Msc
       INGENIERÍA EN INFORMÁTICA
                 Programación II




 UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA

                              Programación II
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
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
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
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
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
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
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
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
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
Definición de Clases

C++

       inline double Complejo::ObtReal(void) {
           return Real;
       }
       inline double Complejo::ObtImag(void) {
           return Imag;
       }




                                   Programación II
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
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
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
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
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
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
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
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 la
del objeto a partir de un apuntador a la        dirección de memoria es un
   dirección de memoria del mismo                          objeto

NOTA: 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
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
                           objeto


NOTA: 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
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
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
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
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
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
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
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
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
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ámetro

Tres objetos instanciados, todos hacen la
     llamada al mismo constructor

                                            Programación II
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
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
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
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
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
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
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
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
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
Elementos estáticos

C++
                                                             Indica que
             class String;
                                                            String es una
             class File {                                    clase cuya
                 private:                                   definición se
Atributo
                    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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 un
Redefini-       public:                                 cuerpo definido y
ció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
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 una
Redefini-
                public double Area(void) { … }         clase abstracta son
ció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
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 {                      virtuales
Redefini-
                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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

More Related Content

What's hot

Componentes de eclipse
Componentes de eclipseComponentes de eclipse
Componentes de eclipsejaquiiMc
 
Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)José Toro
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gioRobert Wolf
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaAngel Vázquez Patiño
 
Cluster MySQL en Windows
Cluster MySQL en WindowsCluster MySQL en Windows
Cluster MySQL en WindowsErick Cruz
 
Organización de los archivos en bases de datos
Organización de los archivos en bases de datosOrganización de los archivos en bases de datos
Organización de los archivos en bases de datosMiguel Orquera
 
Ficheros con organización secuencial indexada
Ficheros con organización secuencial indexadaFicheros con organización secuencial indexada
Ficheros con organización secuencial indexadaFportavella
 
Clases y objetos de java
Clases y objetos de javaClases y objetos de java
Clases y objetos de javainnovalabcun
 
Vectores y Objetos Programacion Orientada a Objetos
Vectores y Objetos Programacion Orientada a ObjetosVectores y Objetos Programacion Orientada a Objetos
Vectores y Objetos Programacion Orientada a ObjetosJanet Brigyth Camacho Medina
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11Miguel Angel
 

What's hot (20)

ADMINISTRACIÓN DE LA SEGURIDAD EN SQL SERVER
ADMINISTRACIÓN DE LA SEGURIDAD EN SQL SERVERADMINISTRACIÓN DE LA SEGURIDAD EN SQL SERVER
ADMINISTRACIÓN DE LA SEGURIDAD EN SQL SERVER
 
Componentes de eclipse
Componentes de eclipseComponentes de eclipse
Componentes de eclipse
 
Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)
 
Polimorfismo en Java
Polimorfismo en JavaPolimorfismo en Java
Polimorfismo en Java
 
Recuperación de-datos-en-my sql
Recuperación de-datos-en-my sqlRecuperación de-datos-en-my sql
Recuperación de-datos-en-my sql
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gio
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
Hacking ético
Hacking éticoHacking ético
Hacking ético
 
1. introducción a c#
1.  introducción a c#1.  introducción a c#
1. introducción a c#
 
Cluster MySQL en Windows
Cluster MySQL en WindowsCluster MySQL en Windows
Cluster MySQL en Windows
 
Introducción a la Seguridad de los Sistemas Operativos
Introducción a la Seguridad de los Sistemas OperativosIntroducción a la Seguridad de los Sistemas Operativos
Introducción a la Seguridad de los Sistemas Operativos
 
Android Studio
Android StudioAndroid Studio
Android Studio
 
Organización de los archivos en bases de datos
Organización de los archivos en bases de datosOrganización de los archivos en bases de datos
Organización de los archivos en bases de datos
 
Ficheros con organización secuencial indexada
Ficheros con organización secuencial indexadaFicheros con organización secuencial indexada
Ficheros con organización secuencial indexada
 
Modelo osi
Modelo   osiModelo   osi
Modelo osi
 
Clases y objetos de java
Clases y objetos de javaClases y objetos de java
Clases y objetos de java
 
Vectores y Objetos Programacion Orientada a Objetos
Vectores y Objetos Programacion Orientada a ObjetosVectores y Objetos Programacion Orientada a Objetos
Vectores y Objetos Programacion Orientada a Objetos
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
 
Java swing
Java swingJava swing
Java swing
 
Windows.forms.ejercicios
Windows.forms.ejerciciosWindows.forms.ejercicios
Windows.forms.ejercicios
 

Viewers also liked

Mapa conceptual java
Mapa conceptual java Mapa conceptual java
Mapa conceptual java hack-13
 
Programacion ii modulo3-leccion1
Programacion ii modulo3-leccion1Programacion ii modulo3-leccion1
Programacion ii modulo3-leccion1karlalopezbello
 
Introduccion a la Programacion Orientada a Objetos
Introduccion a la Programacion Orientada a ObjetosIntroduccion a la Programacion Orientada a Objetos
Introduccion a la Programacion Orientada a ObjetosAlexys González
 
Polimorfismo java
Polimorfismo javaPolimorfismo java
Polimorfismo javaFAFICA
 
Polimorfismo
PolimorfismoPolimorfismo
PolimorfismoCaveiras
 
Polimorfismo ppt
Polimorfismo  pptPolimorfismo  ppt
Polimorfismo pptivanvillar7
 
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Didier Granados
 

Viewers also liked (10)

Mapa conceptual java
Mapa conceptual java Mapa conceptual java
Mapa conceptual java
 
Programacion ii modulo3-leccion1
Programacion ii modulo3-leccion1Programacion ii modulo3-leccion1
Programacion ii modulo3-leccion1
 
Introduccion a la Programacion Orientada a Objetos
Introduccion a la Programacion Orientada a ObjetosIntroduccion a la Programacion Orientada a Objetos
Introduccion a la Programacion Orientada a Objetos
 
Polimorfismo java
Polimorfismo javaPolimorfismo java
Polimorfismo java
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
POO - Aula 10 - Polimorfismo
POO - Aula 10 - PolimorfismoPOO - Aula 10 - Polimorfismo
POO - Aula 10 - Polimorfismo
 
Polimorfismo ppt
Polimorfismo  pptPolimorfismo  ppt
Polimorfismo ppt
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
10 Polimorfismo
10   Polimorfismo10   Polimorfismo
10 Polimorfismo
 
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
 

Similar to Programacion oo (20)

Equivalencias Vb Net Y C
Equivalencias Vb Net Y CEquivalencias Vb Net Y C
Equivalencias Vb Net Y C
 
Programación orientada a objetos con c++ prev
Programación orientada a objetos con c++ prevProgramación orientada a objetos con c++ prev
Programación orientada a objetos con c++ prev
 
Programacion orientada a objetos 2
Programacion orientada a objetos 2Programacion orientada a objetos 2
Programacion orientada a objetos 2
 
Introducción-a-Microsoft.NET-[parte3]
Introducción-a-Microsoft.NET-[parte3]Introducción-a-Microsoft.NET-[parte3]
Introducción-a-Microsoft.NET-[parte3]
 
C sharp intro1
C sharp intro1C sharp intro1
C sharp intro1
 
C sharp intro1
C sharp intro1C sharp intro1
C sharp intro1
 
manual de C#
manual de C#manual de C#
manual de C#
 
Manual c# 2
Manual c# 2Manual c# 2
Manual c# 2
 
Manual de c#
Manual de c#Manual de c#
Manual de c#
 
Clasesyobjetos
ClasesyobjetosClasesyobjetos
Clasesyobjetos
 
[ES] Introdución a la plataforma java
[ES] Introdución a la plataforma java [ES] Introdución a la plataforma java
[ES] Introdución a la plataforma java
 
Met2 07 01-introduccion_poo
Met2 07 01-introduccion_pooMet2 07 01-introduccion_poo
Met2 07 01-introduccion_poo
 
Aprendiendo objetos en c++
Aprendiendo objetos en c++Aprendiendo objetos en c++
Aprendiendo objetos en c++
 
Programación Orientada a Objetos - Unidad 2: clases y objetos
Programación Orientada a Objetos - Unidad 2: clases y objetosProgramación Orientada a Objetos - Unidad 2: clases y objetos
Programación Orientada a Objetos - Unidad 2: clases y objetos
 
C sharp
C sharpC sharp
C sharp
 
Pooc 1
Pooc 1Pooc 1
Pooc 1
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
Programacion en n capas
Programacion en n capasProgramacion en n capas
Programacion en n capas
 
Extendiendo C#, COMPUMAT 2007
Extendiendo C#, COMPUMAT 2007Extendiendo C#, COMPUMAT 2007
Extendiendo C#, COMPUMAT 2007
 
2 POO Presentación
2 POO Presentación2 POO Presentación
2 POO Presentación
 

More from karlalopezbello

03 -fundamentos_de_la_tecnologia_orientada_a_objetos
03  -fundamentos_de_la_tecnologia_orientada_a_objetos03  -fundamentos_de_la_tecnologia_orientada_a_objetos
03 -fundamentos_de_la_tecnologia_orientada_a_objetoskarlalopezbello
 
02 -introduccion_a_la_tecnologia_orientada_a_objetos
02  -introduccion_a_la_tecnologia_orientada_a_objetos02  -introduccion_a_la_tecnologia_orientada_a_objetos
02 -introduccion_a_la_tecnologia_orientada_a_objetoskarlalopezbello
 
Programacion ii modulo3-leccion2
Programacion ii modulo3-leccion2Programacion ii modulo3-leccion2
Programacion ii modulo3-leccion2karlalopezbello
 
Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3karlalopezbello
 
Programacion ii modulo2-leccion2
Programacion ii modulo2-leccion2Programacion ii modulo2-leccion2
Programacion ii modulo2-leccion2karlalopezbello
 
Programacion ii modulo2-leccion1
Programacion ii modulo2-leccion1Programacion ii modulo2-leccion1
Programacion ii modulo2-leccion1karlalopezbello
 
Programacion ii modulo1-leccion1-
Programacion ii modulo1-leccion1-Programacion ii modulo1-leccion1-
Programacion ii modulo1-leccion1-karlalopezbello
 
Sistemas de comunicacion
Sistemas de comunicacionSistemas de comunicacion
Sistemas de comunicacionkarlalopezbello
 
Introduccion unegvirtual
Introduccion unegvirtualIntroduccion unegvirtual
Introduccion unegvirtualkarlalopezbello
 
Guia para montar_el_aula_1_
Guia para montar_el_aula_1_Guia para montar_el_aula_1_
Guia para montar_el_aula_1_karlalopezbello
 
Configuracion del perfil
Configuracion del perfilConfiguracion del perfil
Configuracion del perfilkarlalopezbello
 
Configuracion del perfil
Configuracion del perfilConfiguracion del perfil
Configuracion del perfilkarlalopezbello
 

More from karlalopezbello (20)

03 -fundamentos_de_la_tecnologia_orientada_a_objetos
03  -fundamentos_de_la_tecnologia_orientada_a_objetos03  -fundamentos_de_la_tecnologia_orientada_a_objetos
03 -fundamentos_de_la_tecnologia_orientada_a_objetos
 
02 -introduccion_a_la_tecnologia_orientada_a_objetos
02  -introduccion_a_la_tecnologia_orientada_a_objetos02  -introduccion_a_la_tecnologia_orientada_a_objetos
02 -introduccion_a_la_tecnologia_orientada_a_objetos
 
Programacion ii modulo3-leccion2
Programacion ii modulo3-leccion2Programacion ii modulo3-leccion2
Programacion ii modulo3-leccion2
 
Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3
 
Programacion ii modulo2-leccion2
Programacion ii modulo2-leccion2Programacion ii modulo2-leccion2
Programacion ii modulo2-leccion2
 
Programacion ii modulo2-leccion1
Programacion ii modulo2-leccion1Programacion ii modulo2-leccion1
Programacion ii modulo2-leccion1
 
Programacion ii modulo1-leccion1-
Programacion ii modulo1-leccion1-Programacion ii modulo1-leccion1-
Programacion ii modulo1-leccion1-
 
Didactica del chat
Didactica del chatDidactica del chat
Didactica del chat
 
Didactica del foro
Didactica del foroDidactica del foro
Didactica del foro
 
Guia completa de_moodle
Guia completa de_moodleGuia completa de_moodle
Guia completa de_moodle
 
Publicacion de material
Publicacion de materialPublicacion de material
Publicacion de material
 
Sistemas de comunicacion
Sistemas de comunicacionSistemas de comunicacion
Sistemas de comunicacion
 
Actividades en moodle
Actividades en moodleActividades en moodle
Actividades en moodle
 
Plataforma moodle
Plataforma moodlePlataforma moodle
Plataforma moodle
 
Introduccion unegvirtual
Introduccion unegvirtualIntroduccion unegvirtual
Introduccion unegvirtual
 
Guia para montar_el_aula_1_
Guia para montar_el_aula_1_Guia para montar_el_aula_1_
Guia para montar_el_aula_1_
 
Configuracion del perfil
Configuracion del perfilConfiguracion del perfil
Configuracion del perfil
 
Configuracion del perfil
Configuracion del perfilConfiguracion del perfil
Configuracion del perfil
 
Transparencias7
Transparencias7Transparencias7
Transparencias7
 
Transparencias5
Transparencias5Transparencias5
Transparencias5
 

Programacion oo

  • 1. Presentación Programació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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Definición de Clases C++ inline double Complejo::ObtReal(void) { return Real; } inline double Complejo::ObtImag(void) { return Imag; } Programación II
  • 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. 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. 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. 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. 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. 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. 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. 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 la del objeto a partir de un apuntador a la dirección de memoria es un dirección de memoria del mismo objeto NOTA: 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. 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 objeto NOTA: 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. 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. 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. 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. 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. 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. 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. 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. 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. 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ámetro Tres objetos instanciados, todos hacen la llamada al mismo constructor Programación II
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Elementos estáticos C++ Indica que class String; String es una class File { clase cuya private: definición se Atributo 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 un Redefini- public: cuerpo definido y ció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. 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 una Redefini- public double Area(void) { … } clase abstracta son ció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. 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 { virtuales Redefini- 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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