116
Programación II Ing. Mauricio Paletta, Msc Presentación Programación Orientada a Objetos UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA INGENIERÍA EN INFORMÁTICA Programación II

Programacion oo

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Programacion oo

Programación II

Ing. Mauricio Paletta, Msc

Presentación

Programación Orientada a Objetos

UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA

INGENIERÍA EN INFORMÁTICA

Programación II

Page 2: Programacion oo

Programación II

• ¿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 Orientada a Objetos

Page 3: Programacion oo

Programación II

• 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 Orientada a Objetos

Page 4: Programacion oo

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”.

Page 5: Programacion oo

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”.

Page 6: Programacion oo

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”.

Page 7: Programacion oo

Programación II

C++

class Complejo {

private:

double Real, Imag;

public:

double ObtReal(void) {

return Real;

}

double ObtImag(void) {

return Imag;

}

};

Definición de Clases

Indica definición

de una clase

Identificador de

la clase

Declarativas para

definir la interfaz de

los elementos

Comienza la

definición de la

clase

Termina la

definición de la

clase

Atributos

Métodos

Instanciación de objetos opcional

Page 8: Programacion oo

Programación II

C++

Definición de Clases

• 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

Page 9: Programacion oo

Programación II

C++

Definición de Clases

class Complejo {

double Real;

public:

double ObtReal(void);

private:

double Imag;

public:

double ObtImag(void);

};

double Complejo::ObtReal(void)

{

return Real;

}

double Complejo::ObtImag(void)

{

return Imag;

}

El cuerpo del método

no está aquí

Indica relación de dependencia

con una clase

Page 10: Programacion oo

Programación II

C++

Definición de Clases

• 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.

Page 11: Programacion oo

Programación II

C++

Definición de Clases

inline double Complejo::ObtReal(void) {

return Real;

}

inline double Complejo::ObtImag(void) {

return Imag;

}

Page 12: Programacion oo

Programación II

class Complejo {

private double Real, Imag;

public double ObtReal( ) {

return Real;

}

public double ObtImag( ) {

return Imag;

}

}

Java / C#

Definición de Clases

Indica definición

de una clase

Identificador de

la clase

Declarativas para

definir la interfaz de

los elementos

Comienza la

definición de la

clase

Termina la

definición de la

clase

Atributos

Métodos

Page 13: Programacion oo

Programación II

Java

Definición de Clases

• 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.

Page 14: Programacion oo

Programación II

C#

Definición de Clases

• 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.

Page 15: Programacion oo

Programación II

class Complejo {

private double Real, Imag;

public double ParteReal {

get {

return Real;

}

}

public double ParteImag {

get {

return Imag;

}

}

}

C#

Definición de Clases

Se puede acceder

al atributo privado

Real mediante este

elemento público.

Para los ojos del

usuario es como si

fuera un atributo

pero realmente es

un método.

Usado para indicar

el retorno del valor

del atributo

Se puede usar

también la

sentencia set para

indicar las acciones

a tomar con la

modificación del

valor del atributo

Page 16: Programacion oo

Programación II

C++

Instanciación de Objetos

Complejo C1, C2, *pC;

pC = new Complejo;

delete pC;

Liberación del espacio creado

de forma dinámica. Debe ser

hecho por el programador

Instancias u objetos

(instanciación estática)No es un objeto

sino un apuntador o

dirección de memoria

Instanciación dinámica

haciendo uso del apuntador

Identificador

de la Clase

Page 17: Programacion oo

Programación II

Java

Instanciación de Objetos

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).

Instancia u objetoIdentificador

de la Clase

Page 18: Programacion oo

Programación II

C#

Instanciación de Objetos

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).

Instancia u objetoIdentificador

de la Clase

Page 19: Programacion oo

Programación II

C++

Acceso a Elementos de la Clase

Complejo C, *pC = new Complejo;

double d = C.ObtReal( );

pCObtImag( );

(*pC).ObtImag( );

Operador para acceder a los elementos

del objeto a partir de un apuntador a la

dirección de memoria del mismo

Llamadas de mensajes

o ejecución de

métodos

El contenido de la

dirección de memoria es un

objeto

Operador para

acceder a los

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.

Page 20: Programacion oo

Programación II

Java / C#

Complejo C = new Complejo( );

double d = C.ObtReal( );

Operador para

acceder a los

elementos del

objeto

Acceso a Elementos de la Clase

Llamada de mensaje o

ejecución del método

NOTA: Recordar que los permisos de acceso a los elementos están

regidos por la interfaz asociada en la definición de la clase.

Page 21: Programacion oo

Programación II

C#

Complejo C = new Complejo( );

double d = C.ParteReal;

Operador para

acceder a los

elementos del

objeto

Acceso a Elementos de la Clase

Acceso al atributo

público (llamada

automática al mensaje

get asociada al

atributo)

Page 22: Programacion oo

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.

Page 23: Programacion oo

Programación II

C++class Complejo {

private:

double Real, Imag;

public:

Complejo(void) {

Real = Imag = 0.0;

}

double ObtReal(void) {

return Real;

}

double ObtImag(void) {

return Imag;

}

};

No está permitido la

inicialización de variables

en este contexto

Un constructor para la

clase

Constructor

NOTA: Si no se

especifica un

constructor la data

del objeto queda

sin inicializar

(embasurada).

Page 24: Programacion oo

Programación II

class Complejo {

private double Real = 0.0;

private double Imag = 0.0;

public Complejo( ) {

Real = Imag = 0.0;

}

public double ObtReal( ) {

return Real;

}

public double ObtImag( ) {

return Imag;

}

}

Java / C#

Se permite la inicialización

de elementos en este

contexto

Un constructor

para la clase

Constructor

NOTA: Si no se especifica un

constructor para la clase,

se asume uno por defecto

que no tiene parámetros y

que inicializa todos los

atributos en los literales

nulos correspondientes (0,

false, „\0‟, null, etc.)

Page 25: Programacion oo

Programación II

• 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.

Polimorfismo

Page 26: Programacion oo

Programación II

C++class Complejo {

private:

double Real, Imag;

public:

Complejo(void) {

Real = Imag = 0.0;

}

Complejo(double R, double I) {

Real = R, Imag = I;

}

} C1, C2(1.0, -1.0);

Dos objetos instanciados cada uno de los cuales llama

a un constructor diferente

Polimorfismo

sobre el

constructor

Polimorfismo

Page 27: Programacion oo

Programación II

class Complejo {

private double Real = 0.0;

private double Imag = 0.0;

public Complejo( ) {

Real = Imag = 0.0;

}

public Complejo(double R, double I ) {

Real = R; Imag = I;

}

}

Complejo C1 = new Complejo( ),

C2 = new Complejo(1.0, -1.0);

Java / C#

Polimorfismo

sobre el

constructor

Dos objetos instancia-

dos cada uno de los

cuales llama a un

constructor diferente

Polimorfismo

Page 28: Programacion oo

Programación II

• 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.

Inicialización por defecto

Page 29: Programacion oo

Programación II

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

Inicialización por defecto

Tres objetos instanciados, todos hacen la

llamada al mismo constructor

Page 30: Programacion oo

Programación II

C++

Inicialización por defecto

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.

Page 31: Programacion oo

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;

private double Imag = 0.0;

public Complejo(double R, double I ) {

Real = R; Imag = I;

}

}

Complejo C = new Complejo( );

Es un error porque no

se puede resolver con

el constructor existente

Inicialización de

elementos

Page 32: Programacion oo

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.

Page 33: Programacion oo

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.

Page 34: Programacion oo

Programación II

C++class Complejo {

private:

double Real, Imag;

public:

Complejo(double R = 0.0, double I = 0.0) {

Real = R, Imag = I;

}

~Complejo(void) { }

};

El destructor se llama

igual que la clase pero

con el prefijo ~

Expresa que el método

tiene un cuerpo vacío

o no tiene código

asociado

Destructor

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

Page 35: Programacion oo

Programación II

Java

protected void finalize( ) {

}

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.

Destructor

Se puede redefinir el método

finalize para que sea llamado

de forma automática por el

algoritmo de recuperación de

memoria

Page 36: Programacion oo

Programación II

C#

class Complejo {

void Finalize( ) {

}

}

Destructor

Al igual que Java, se puede

redefinir el método Finalize

para que sea llamado de forma

automática por el algoritmo de

recuperación de memoria

También soporta la misma sintaxis

de C++ y tener un método que se

llama igual que la clase con el

prefijo ~. Este método y la

redefinición de Finalize no pueden

convivir en la misma clase

class Complejo {

~Complejo( ) {

}

}

Page 37: Programacion oo

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.

Page 38: Programacion oo

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.

Page 39: Programacion oo

Programación II

C++

class String;

class File {

private:

static int NumAbiertos;

public:

File(const String &, const String &);

File(const File &);

~File(void);

static int Abiertos(void) {

return NumAbiertos;

}

};

Destructor

Atributo

estático

Elementos estáticos

Método

estático

Indica pasaje

de parámetro

por referencia

Indica que

String es una

clase cuya

definición se

encontrará

mas adelante

Page 40: Programacion oo

Programación II

C++

int File::NumAbiertos = 0;

File::File(const String &N, const String &M) {

NumAbiertos++;

}

File::~File(void) {

NumAbiertos--;

}

Elementos estáticos

Asignación del valor

inicial al atributo

estático, nótese que

está fuera de la

definición de la clase

Constructor y

destructor definidos

fuera de la definición

de la clase

Page 41: Programacion oo

Programación II

Java

public class Ejemplo {

static int NumInstancias = 0;

public static int Instancias( ) {

return NumInstancias;

}

public Ejemplo( ) {

NumInstancias++;

}

public static void main(String args[ ]) {

}

}

Elementos estáticos

Atributo estático con su

inicialización

Para definir el código

del programa principal

Para tomar los posibles

argumentos del

programa principal

La clase que contiene

el programa principal

debe ser pública

Método estático

Page 42: Programacion oo

Programación II

C#

public class Ejemplo {

static int NumInstancias = 0;

public static int Instancias( ) {

return NumInstancias;

}

public Ejemplo( ) {

NumInstancias++;

}

public static void Main(string args[ ]) {

}

}

Elementos estáticos

Atributo estático con su

inicialización

Para definir el código

del programa principal

Para tomar los posibles

argumentos del

programa principal

La clase que contiene

el programa principal

debe ser pública

Método estático

Page 43: Programacion oo

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).

Page 44: Programacion oo

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.

Page 45: Programacion oo

Programación II

Java / C#

C++

Complejo C1(2.5, -1.0), C2 = C1, C3 = 1.0;

Uso del operador de

asignación entre objetos

Operador de Asignación o Copia

Complejo C1 = new Complejo(2.5, -1.0), C2 = C1;

Complejo C1 = new Complejo(2.5, -1.0),

C2 = new Complejo( );

C2 = C1;

Construcción indirecta

de una instancia para

resolver la operación

Page 46: Programacion oo

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)

Page 47: Programacion oo

Programación II

C++

Sobrecarga de Operadores

• 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.

Page 48: Programacion oo

Programación II

C++

Sobrecarga de Operadores

• 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).

Page 49: Programacion oo

Programación II

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

Sobrecarga de Operadores

Page 50: Programacion oo

Programación II

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

Sobrecarga de Operadores

Page 51: Programacion oo

Programación II

Java

Sobrecarga de Operadores

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.

Page 52: Programacion oo

Programación II

C#

Sobrecarga de Operadores

• 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): ( )

Page 53: Programacion oo

Programación II

C#

Sobrecarga de Operadores

• 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).

Page 54: Programacion oo

Programación II

C#

Sobrecarga de Operadores

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.

Page 55: Programacion oo

Programación II

C#

Sobrecarga de Operadores

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

Page 56: Programacion oo

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 .

Page 57: Programacion oo

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.

Page 58: Programacion oo

Programación II

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

Referencia al objeto actual

Page 59: Programacion oo

Programación II

Java

Referencia al objeto actual

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);

}

}

Page 60: Programacion oo

Programación II

C#

Referencia al objeto actual

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);

Page 61: Programacion oo

Programación II

C++

Herencia

class Carro {

private:

int Mod, Cap;

public:

Carro(int M = 0, int C = 0) { … }

};

class Carga : public Carro {

private:

int CapCarga;

public:

Carga(int M = 0, int C = 0, int P = 0) :

Carro(M, C) { … }

};

Constructor clase

Derivada

Llamada al constructor

de la clase Base

Interfaz de la herencia

(¿Cómo serán vistos en clase

Derivada los elementos

públicos de la clase Base?)

Constructor clase Base

Operador de

relación entre

clase Base y

clase Derivada

Page 62: Programacion oo

Programación II

C++

Herencia

class A {

private: int A1;

protected: int A2;

public: int A3;

};

class B : private A {

private: int B1;

protected: int B2;

public: int B3;

};

Dentro

de B

En

Deriva-

das de BFuera de

B

A1

A2

A3

B1

B2

B3

Page 63: Programacion oo

Programación II

C++

Herencia

class A {

private: int A1;

protected: int A2;

public: int A3;

};

class C : protected A {

private: int C1;

protected: int C2;

public: int C3;

};

Dentro

de C

En

Deriva-

das de CFuera de

C

A1

A2

A3

C1

C2

C3

Page 64: Programacion oo

Programación II

C++

Herencia

class A {

private: int A1;

protected: int A2;

public: int A3;

};

class D : public A {

private: int D1;

protected: int D2;

public: int D3;

};

Dentro

de D

En

Deriva-

das de DFuera de

D

A1

A2

A3

D1

D2

D3

Page 65: Programacion oo

Programación II

C++

Herencia

class B1 {

private: int IB1;

public:

B1(int I = 0) { IB1 = I; }

};

class D : public B1, public B2 {

public:

D(int I1 = 0, int I2 = 0) : B1(I1), B2(I2) { };

};

class B2 {

private: int IB2;

public:

B2(int I = 0) { IB2 = I; }

};

Herencia múltiple

Constructores de clases Base

Page 66: Programacion oo

Programación II

C++

Herencia

class B1 {

public: int B;

};

class D : public B1, public B2 {

public: int B;

} UnD;

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

class B2 {

public: int B;

};

Operador que

indica búsqueda

sobre un

contexto superior

(en la jerarquía)

al actual

Page 67: Programacion oo

Programación II

C++

Herencia

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

Page 68: Programacion oo

Programación II

Java

Herencia

class Carro {

private int Mod = 0, Cap = 0;

public Carro(int M, int C) { … }

}

class Carga extends Carro {

private int CapCarga = 0;

public Carga(int M, int C, int P) {

super(M, C);

}

}

Constructor clase Base

Indica herencia

Constructor clase

Derivada

Llamada al constructor

de la clase Base

Page 69: Programacion oo

Programación II

Java

Herencia

class A {

public int I;

}

class B extends A {

public int I;

public B(int I1, int I2) {

I = I1; // Acceso al elemento I de B

// (equivalente a usar this.I)

A.I = I2; // Acceso al elemento I de A

}

}

B UnB = new B(1, -1);

// Acceso al elemento I

// de B.

//

UnB.I++;

// No es posible acceder

// al elemento I de A con

// la instancia UnB, no

// hay forma de resolver

// la ambigüedad con el

// elemento I entre la

// clase base A y la clase

// derivada B

Page 70: Programacion oo

Programación II

Java

Herencia

public interface VideoClip {

void Play( );

void Stop( );

}

class MiClase implements VideoClip {

void Play( ) { … }

void Stop( ) { … }

}

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).

Representa una interfaz

Clase que implementa o

usa una interfaz

Definición de los

métodos de la interfaz

Métodos de la interfaz a

definir en otro lugar

Page 71: Programacion oo

Programación II

Java

Herencia

interface Interfaz1 {

public void Print1( );

}

interface Interfaz2 {

public void Print2( );

}

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”); }

}

NOTA: Aunque Java no

soporta la herencia

múltiple, el uso de

interfaces represen-

ta un truco para

hacer algo parecido

Page 72: Programacion oo

Programación II

C#

Herencia

class Carro {

private int Mod = 0, Cap = 0;

public Carro(int M, int C) { … }

};

class Carga : Carro {

private int CapCarga = 0;

public Carga(int M, int C, int P) :

base(M, C) {

}

}

Constructor clase Base

Indica herencia

Constructor clase

Derivada

Llamada al constructor

de la clase Base

Page 73: Programacion oo

Programación II

C#

Herencia

class A {

public int I;

}

class B : A {

new public int I;

public B(int I1, int I2) {

this.I = I1; // Elemento I de B

base.I = I2; // Elemento I de A

}

}

B UnB = new B(1, -1);

// Acceso al elemento I

// de B.

//

UnB.I++;

// No es posible acceder

// al elemento I de A con

// la instancia UnB, no

// hay forma de resolver

// la ambigüedad con el

// elemento I entre la

// clase base A y la clase

// derivada B

Permite indicar que

es un elemento

nuevo y no se trata

de una redefinición

relativa a la clase

base

Page 74: Programacion oo

Programación II

C#

Herencia

public interface VideoClip {

int Frames { get; }

void Play( );

void Stop( );

}

class MiClase : VideoClip {

public int Frames { get { … } }

public void Play( ) { … }

public void Stop( ) { … }

}

NOTA: Una interface en C# representa un conjunto de atributos (de C#)

y métodos cuya definición (implementación) está en otro lugar.

Representa una interfaz

Clase que implementa o

usa una interfaz

Definición de los

atributos y métodos de

la interfaz

Métodos de la interfaz a

definir en otro lugar

Atributo de la interfaz a

definir en otro lugar

Page 75: Programacion oo

Programación II

C#

Herencia

interface Interfaz1 {

void Print1( );

}

interface Interfaz2 {

void Print2( );

}

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”); }

}

NOTA: Aunque C# no

soporta la herencia

múltiple, el uso de

interfaces representa

un truco para hacer

algo parecido

Page 76: Programacion oo

Programación II

C++

Clases abstractas y métodos virtuales

class Graphics {

public:

virtual void DrawL(int x1, int y1, int x2, int y2) { … }

virtual double Area(void) = 0;

};

class MyClass : public Graphics {

public:

double Area(void) { … }

};

Método

virtual

NOTA: Una clase que tenga al menos un método virtual puro es una

clase abstracta (no es posible crear instancias con ella).

Redefini-

ción del

método

virtual

Método

virtual

puroIndica que la

función no tiene un

cuerpo definido y

que debe ser hecho

en las clases

derivadas

Page 77: Programacion oo

Programación II

Java

Clases abstractas y métodos virtuales

abstract class Graphics {

public void DrawL(int x1, int y1, int x2, int y2) { … }

public abstract double Area(void);

}

class MyClass extends Graphics {

public double Area(void) { … }

}

Método

virtual

NOTA: Una clase que tenga al menos un método virtual debe ser

declarada abstracta obligatoriamente.

Redefini-

ción del

método

virtual

No todos los

métodos de una

clase abstracta son

virtuales

Clase

abstracta

Page 78: Programacion oo

Programación II

C#

Clases abstractas y métodos virtuales

abstract class Graphics {

public void DrawL(int x1, int y1, int x2, int y2) { … }

public abstract double Area(void);

}

class MyClass : Graphics {

public override double Area(void) {

}

}

Método

virtual

puro

NOTA: Una clase que tenga al menos un método virtual puro (método

abstracto) debe ser declarada abstracta obligatoriamente.

Redefini-

ción del

método

virtual

No todos los

métodos de una

clase abstracta son

virtuales

Clase

abstracta

Page 79: Programacion oo

Programación II

C#

Clases abstractas y métodos virtuales

class A {

public virtual void F1(void) { … }

public virtual void F2(void) { … }

public virtual void F3(void) { … }

}

class B : A {

public override void F1(void) { … }

public new void F2(void) { … }

public new virtual F3(void) { … }

}

NOTA: Los métodos virtuales pueden ser redefinidos en clases

derivadas; deben tener una definición válida (cuerpo) en la

clase base.

Métodos virtuales

Redefinición del método F1

Nueva versión del método F2

Nueva versión del método F3

y virtual para las clases

derivadas de B

Page 80: Programacion oo

Programación II

C++

Paquetes

namespace MiPaquete {

class Clase1 {

};

}

int main(void) {

MiPaquete::Clase1 Obj1;

}

NOTA: Se hace uso del concepto conocido como “espacio de

nombres”.

Declaración e inicio del espacio de

nombres o paquete

Forma de acceder a los elementos

definidos dentro del paquete

Cualquier cosa definida dentro del

bloque del espacio de nombres

pertenece al paquete

Page 81: Programacion oo

Programación II

C++

Paquetes

namespace Nuevo = MiPaquete;

int main(void) {

using namespace Nuevo;

Clase1 Obj1;

}

Permite definir nombres

alternativos a paquetes ya

existentes

Indica que los elementos

usados en el bloque ocurrente,

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.

Page 82: Programacion oo

Programación II

Java

Paquetes

package MiPaquete;

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.

Indica que las clases definidas en este

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.MiClasePara hacer referencia a alguna de las clases

del Paquete (permite resolver ambigüedades)

Page 83: Programacion oo

Programación II

C#

Paquetes

using Paquete1;

namespace MiPaquete {

class Clase1 {

}

}

NOTA: Se hace uso del concepto de espacio de nombres. Se

pueden anidar entre sí.

Declaración e inicio del espacio de

nombres o paquete

Cualquier clase definida dentro del

bloque del espacio de nombres

pertenece al paquete

Indica que este archivo fuente hace uso

del paquete indicado

Paquete1.Clase1

Para hacer referencia a alguna de las

clases del Paquete (permite resolver

ambigüedades)

Page 84: Programacion oo

Programación II

C++ - Funciones y Clases amigas

Otros Conceptos

• 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.

Page 85: Programacion oo

Programación II

C++ - Funciones y Clases amigas

Otros Conceptos

• 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).

Page 86: Programacion oo

Programación II

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 *);

};

C++ - Funciones y Clases amigas

NOTA: Una función o clase puede ser amiga de dos clases

diferentes. Dos clases pueden ser amigas entre sí.

Otros Conceptos

Page 87: Programacion oo

Programación II

// 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;

}

C++ - Funciones y Clases amigas

Otros Conceptos

Page 88: Programacion oo

Programación II

C++ - Plantillas de funciones y clases

Otros Conceptos

• 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.

Page 89: Programacion oo

Programación II

C++ - Plantillas de funciones y clases

Otros Conceptos

• 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.

Page 90: Programacion oo

Programación II

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;

}

Otros Conceptos

C++ - Plantillas de funciones y clases

Page 91: Programacion oo

Programación II

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

Otros Conceptos

C++ - Plantillas de funciones y clases

Page 92: Programacion oo

Programación II

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

Otros Conceptos

C++ - Plantillas de funciones y clases

Page 93: Programacion oo

Programación II

// 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

Otros Conceptos

C++ - Plantillas de funciones y clases

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.

Page 94: Programacion oo

Programación II

C++ - Conversión avanzada de clases

Otros Conceptos

• 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);

Page 95: Programacion oo

Programación II

• 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).

C++ - Conversión avanzada de clases

Otros Conceptos

class A { } *a = new A;

class B : public A { } *b = static_cast <B *> (a);

Page 96: Programacion oo

Programación II

C++ - Conversión avanzada de clases

Otros Conceptos

• 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

Page 97: Programacion oo

Programación II

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)) …

Otros Conceptos

Page 98: Programacion oo

Programación II

• 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.

Java – Clases y métodos finales

Otros Conceptos

Page 99: Programacion oo

Programación II

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

}

Java – Clases y métodos finales

Otros Conceptos

Page 100: Programacion oo

Programación II

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.

Otros Conceptos

Page 101: Programacion oo

Programación II

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

}

}

C# – Clases y métodos finales

Otros Conceptos

Page 102: Programacion oo

Programación II

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.

Otros Conceptos

Page 103: Programacion oo

Programación II

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) {

}

}

C# – Constructor estático

Otros Conceptos

Page 104: Programacion oo

Programación II

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.

Otros Conceptos

Page 105: Programacion oo

Programación II

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];

} }

}

}

C# – Indexadores

Otros Conceptos

Page 106: Programacion oo

Programación II

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).

Otros Conceptos

Page 107: Programacion oo

Programación II

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

}

C# – Clases anidadas

Otros Conceptos

Page 108: Programacion oo

Programación II

class A { … }

class B : A { … }

class C : B { … }

A a;

a = new A( );

a = new B( ); // Ok

a = new C( ); // Ok

B b = a; // ERROR

if (a is C) … // true

if (a is B) … // true

if (a is A) … // true

a = null; // Ok

if (a is C) … // false

C# – Operaciones de conversión entre clases

A a = new C( ); // Ok

B b = (B)a; // Si (a is B) Ok

C c = (C)a; // sino Excepción

a = null; // Ok

c = (C)a; // Ok

A a = new C( ); // Ok

B b = a as B; // Si (a is B) b = (B)a

C c = a as C; // sino b = null

a = null;

c = a as C // c == null

Otros Conceptos

Page 109: Programacion oo

Programación II

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.

Otros Conceptos

Page 110: Programacion oo

Programación II

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.

Otros Conceptos

Page 111: Programacion oo

Programación II

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;

C# – Delegados y eventos

Otros Conceptos

Page 112: Programacion oo

Programación II

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.

Otros Conceptos

Page 113: Programacion oo

Programación II

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 { … }

Otros Conceptos

Page 114: Programacion oo

Programación II

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)]

Otros Conceptos

Page 115: Programacion oo

Programación II

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

Otros Conceptos

Page 116: Programacion oo

Programación II

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;

}

}

Otros Conceptos