Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Seccin 7.1-7.2
Implementacin de la encapsulacin
Implementacin Usual en Ada: package NumeroRacional is type racional is record -- Tipo definido por el usuario num, den: integer end record; procedure mult(x in racional; -- Operacin abstracta y in racional; z out racional); end package; package body NumeroRacional is -- Encapsulacin procedure mult(x in racional; y in racional; z out racional) begin z.num := x.num * y.num; z.den := x.den * y.den; end; end package;
3
Tipos privados
package NumeroRacional is type racional is private; -- Tipo definido por el usuario procedure mult(x in racional; -- Operacin abstracta y in racional; z out racional); private type racional is record -- Tipo definido por el usuario num, den: integer end record; end package; package body NumeroRacional is Como lo anterior procedure mult(x in racional; y in racional; z out racional) begin z.num := x.num * y.num; z.den := x.den * y.den; end; end package;
5
Visibilidad de objetos: public: conocido globalmente private: conocido solo localmente protected provisto por herencia
Herencia
Herencia provee mecanismos para pasar informacin de un objeto de datos a otro automticamente Provee una forma de mbito de datos similar al mbito esttico.
Herencia a travs de Datos en lenguajes orientado a objetos es explicito a travs de tipos derivados.
mbito esttico (arriba) Nombres son conocidos implcitamente a travs de nombres de procedimientos anidados
10
Potencia de la herencia
class racional { public: mult( ...) { ... } protected: error( ...) { ... } ... private: ... } class complejo:racional { public: mult( ...) { ... } private: ... } complejo X; Funcin de error es pasada (heredada) a clase complejo, por lo que X.error es una llamada de funcin vlida. Cualquier clase derivada puede invocar error y una funcin legal ser ejecutada. Pero que sucede si queremos que error imprima el tipo de su argumento? (por Ej., queremos conocer si el error ocurri en un dato racional o complejo?)
11
12
Funciones virtuales
Clase base: class racional { error() { cout << nombre() << endl; } string nombre() { return racional;} ... } Clase derivada: class complejo: racional { string nombre() { return complejo;} ... } Pero si el error es llamado, racional es siempre impreso ya que la llamada racional::nombre esta compilada en clase racional para la llamada en la funcin error. Pero si nombre es definido como: virtual string nombre() { return racional;} Entonces nombre() esta definida como una funcin virtual y la funcin nombre en el objeto actual es invocada cuando nombre() es llamada en racional::error.
13
racional A; complejo B; A.error() error llamar a nombre() en racional B.error() error llamar a nombre() en complejo
14
16
Clases amigas
Clases amigas: Herencia estricta algunas veces es difcil de realizar (por Ej., Muy difcil de hacerlo bien por lo que hay que buscar alternativas!)
17
Herencia mixta
Asuma que queremos aadir la caracterstica X y B: a ambas clases A
La manera usual es la de redefinir ambas clases. Herencia mixta: Tiene definicin que es sumada a clase base (No es parte de C++) Por ejemplo, lo siguiente es una sintaxis posible: featureX mixin {int valcounter} Aade campo a objeto nuevaclaseA class A mod featureX; nuevaclaseB class B mod featureX; Se puede obtener un efecto similar con herencia mltiple: class nuevaclaseA:A,featureX { ... } class nuevaclaseB:B,featureX { ... }
18
Principios de herencia
1. Especializacin: Forma usual de herencia: Cheque hereda propiedad de Cuenta. Opuesto es generalizacin: Cuenta es ms general Que Cheque. 2. Descomposicin: Rompe un objeto encapsulado en partes. Un objeto racional es un num y un den. Concepto opuesto es acumulacin (aggregation). 3. Instanciacin: Creacin de instancias de un objeto: racional A, B, C; Representa 3 instancias de objeto racional. 4. Individualizacin: Relacionado con especializacin. Separa objetos por funciones y no estructura. Una pila y un conjunto pueden ambos ser un puntero a un arreglo y un puntero ndice, pero son funcionalmente diferentes. Lo opuesto es agrupacin (grouping.)
19
Sobrecarga
Dos operadores con el mismo nombre pero diferente firmas se dice que tienen sobrecarga. Lenguajes antiguos permitieron sobrecarga en funciones incorporadas, por Ej., real+real es diferente de integer+integer es diferente de integer+real es diferente de real+integer Sobrecarga en C++; cout << 123 el operador << tiene argumentos cout y 123. cout << ``abc'' el operador << tiene argumentos cout y ``abc''.
20
Sobrecarga (continuacin)
Sobrecarga no-primitiva: mifuncin (int a, int b) { ... } mifuncin (int a) { ... } Cada firma difiere, por lo que una funcin diferente es llamada. Note que esto es una propiedad esttica determinada por el compilador. Que hay sobre lo siguiente: mifuncin (int a, int b=7) { ... } mifuncin (char a) { ... }
mifuncin(3)? mifuncin('a')?
21
Resolucin de sobrecarga
En C++: Dado X(args) {...} Dado X(args) {...} 1. Si las firmas corresponden exactamente, la segunda es una redeclaracin de la primera. 2. Si los argumentos corresponden exactamente pero, el tipo de retorno no corresponde, el segundo es un error. 3. Si los argumentos no corresponden exactamente, la segunda es una definicin de sobrecarga. Conceptos relacionados: Coercin: A menudo implementadas como parte de los operadores con sobrecarga incorporados (discutido anteriormente) Polimorfismo: Los tipos estn definidos por argumentos parametrizados (por Ej., type micadena = string(N: integer);) proc mifuncin(X: micadena(N)) {...} call mifuncin(Midato(17)); Discutiremos polimorfismo ms adelante.
22