Modelos y Paradigmas de Programación

Anuncio
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Modelos y Paradigmas de Programación
Programación Orientada a Objetos (1)
Juan Francisco Dı́az Frias
Maestrı́a en Ingenierı́a, Énfasis en Ingenierı́a de Sistemas y Computación
Universidad del Valle, Cali, Colombia
Escuela de Ingenierı́a de Sistemas y Computación,
home page: http://eisc.univalle.edu.co/
[email protected]
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Abstracción de datos
Definición
Una abstracción de datos es una manera de usar datos en forma
abstracta, i.e., podemos usar los datos sin tener en cuenta su
implementación.
Ventajas
Usar la abstracción suele ser mucho más sencillo
Razonar sobre los datos puede ser más sencillo
El sistema puede asegurar que los datos se utilicen de la
manera correcta
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Abstracción de datos
Definición
Una abstracción de datos es una manera de usar datos en forma
abstracta, i.e., podemos usar los datos sin tener en cuenta su
implementación.
Ventajas
Usar la abstracción suele ser mucho más sencillo
Razonar sobre los datos puede ser más sencillo
El sistema puede asegurar que los datos se utilicen de la
manera correcta
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Tipos Abstractos de datos (1)
Definición TAD
Un conjunto de valores junto con un conjunto de operaciones sobre
esos valores. Puede ser abierto o seguro.
Ejemplo: Pila abierta
fun
fun
fun
fun
{PilaNueva} nil end
{Colocar S E} E|S end
{Sacar S E} case S of X|S1 then E=X S1 end end
{EsVacı́a S} S==nil end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Tipos Abstractos de datos (2)
Seguridad
proc {NuevoEmpacador ?Envolver ?Desenvolver}
Llave={NewName} in
fun {Envolver X}
{Chunk.new envolver(Llave:X)}
end
fun {Desenvolver W}
try W.Llave catch _ then raise
error(desenvolver(W)) end end
end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Tipos Abstractos de datos (3)
Ejemplo: Pila segura
local Envolver Desenvolver in
{NuevoEmpacador Envolver Desenvolver}
fun {PilaNueva} {Envolver nil} end
fun {Colocar S E} {Envolver E|{Desenvolver S}}
end
fun {Sacar S E}
case {Desenvolver S} of X|S1 then E=X
{Envolver S1} end
end
fun {EsVacı́a S} {Desenvolver S}==nil end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Otras maneras de organizar abstracciones
Según caracterı́sticas . . .
Del modelo declarativo: Abierto o Seguro.
Del modelo con estado: Empaquetado o no, Con estado o no.
Abierto, declarativo,
y desempaquetado
El estilo, abierto y declarativo, normal
tal como se usa en Prolog y Scheme
Seguro, declarativo,
y desempaquetado
El estilo TAD
Seguro, declarativo,
y empaquetado
El estilo APD con objetos
declarativos
Seguro, con estado,
y empaquetado
El estilo APD con objetos con estado,
tal como se usa en Smalltalk y Java
Seguro, con estado,
y desempaquetado
El estilo TAD con ‘‘valores’’ con estado
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Pila declarativa, empaquetada, y segura
local
fun {ObjetoPila S}
fun {Colocar E} {ObjetoPila E|S} end
fun {Sacar ?E}
case S of X|S1 then E=X {ObjetoPila S1}
end end
fun {EsVacı́a} S==nil end
in pila(colocar:Colocar sacar:Sacar
esVacı́a:EsVacı́a) end
in
fun {PilaNueva} {ObjetoPila nil} end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Pila con estado, empaquetada, y segura
fun {PilaNueva}
C={NewCell nil}
proc {Colocar E} C:=E|@C end
fun {Sacar} case @C of X|S1 then C:=S1 X end
end
fun {EsVacı́a} @C==nil end
in
pila(colocar:Colocar sacar:Sacar
esVacı́a:EsVacı́a)
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Pila con estado, empaquetada, y segura (con
procedimiento de despacho)
fun {PilaNueva}
C={NewCell nil}
proc {Colocar E} C:=E|@C end
fun {Sacar} case @C of X|S1 then C:=S1 X end
end
fun {EsVacı́a} @C==nil end
in
proc {$ Msj}
case Msj
of colocar(X) then {Colocar X}
[] sacar(?E) then E={Sacar}
[] esVacı́a(?B) then B={EsVacı́a}
end
end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Pila con estado, desempaquetada, y segura
declare
local Envolver Desenvolver
{NuevoEmpacador Envolver Desenvolver}
fun {PilaNueva} {Envolver {NewCell nil}} end
proc {Colocar S E} C={Desenvolver S} in C:=E|@C
end
fun {Sacar S}
C={Desenvolver S} in case @C of X|S1 then
C:=S1 X end end
fun {EsVacı́a S} @{Desenvolver S}==nil end
in
Pila=pila(nueva:PilaNueva colocar:Colocar
sacar:Sacar esVacı́a:EsVacı́a)
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
El estilo Objeto
Objeto
Una abstracción de datos empaquetada se denomina abstracción
procedimental de datos, o APD. Y define una entidad llamada
objeto.
Ejecución de un objeto
Una operación se ejecuta invocando al objeto e informándole
cuál operación realizar: “enviar un mensaje al objeto;” Ojo.
No lo es, en el sentido que lo hemos estudiado.
Una invocación a un objeto es sincrónica.
Popularidad
Modularidad y estructuración de programas.
Facilidad con que el estilo objeto soporta polimorfismo y
herencia. Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
El estilo Objeto
Objeto
Una abstracción de datos empaquetada se denomina abstracción
procedimental de datos, o APD. Y define una entidad llamada
objeto.
Ejecución de un objeto
Una operación se ejecuta invocando al objeto e informándole
cuál operación realizar: “enviar un mensaje al objeto;” Ojo.
No lo es, en el sentido que lo hemos estudiado.
Una invocación a un objeto es sincrónica.
Popularidad
Modularidad y estructuración de programas.
Facilidad con que el estilo objeto soporta polimorfismo y
herencia. Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
El estilo Objeto
Objeto
Una abstracción de datos empaquetada se denomina abstracción
procedimental de datos, o APD. Y define una entidad llamada
objeto.
Ejecución de un objeto
Una operación se ejecuta invocando al objeto e informándole
cuál operación realizar: “enviar un mensaje al objeto;” Ojo.
No lo es, en el sentido que lo hemos estudiado.
Una invocación a un objeto es sincrónica.
Popularidad
Modularidad y estructuración de programas.
Facilidad con que el estilo objeto soporta polimorfismo y
herencia. Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Polimorfismo
En lenguaje natural. . .
Es la capacidad de una entidad de tomar varias formas.
En el contexto de abstracción de datos
Una operación es polimórfica si funciona correctamente con
argumentos de diferentes tipos.
Estilo Objeto vs TAD
El polimorfismo es más fácil de expresar en el estilo Objeto.
Aunque se puede expresar en el estilo TAD, es más incómodo
pues requiere de módulos de primera clase.
El estilo TAD ofrece mayor libertad para hacer
implementaciones eficientes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Polimorfismo
En lenguaje natural. . .
Es la capacidad de una entidad de tomar varias formas.
En el contexto de abstracción de datos
Una operación es polimórfica si funciona correctamente con
argumentos de diferentes tipos.
Estilo Objeto vs TAD
El polimorfismo es más fácil de expresar en el estilo Objeto.
Aunque se puede expresar en el estilo TAD, es más incómodo
pues requiere de módulos de primera clase.
El estilo TAD ofrece mayor libertad para hacer
implementaciones eficientes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Polimorfismo
En lenguaje natural. . .
Es la capacidad de una entidad de tomar varias formas.
En el contexto de abstracción de datos
Una operación es polimórfica si funciona correctamente con
argumentos de diferentes tipos.
Estilo Objeto vs TAD
El polimorfismo es más fácil de expresar en el estilo Objeto.
Aunque se puede expresar en el estilo TAD, es más incómodo
pues requiere de módulos de primera clase.
El estilo TAD ofrece mayor libertad para hacer
implementaciones eficientes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Ejemplo: un tipo Colección
Tipo Colección
Tres operaciones:
agregar para añadir un elemento,
extraer para sacar un elemento, y
esVacı́a para comprobar si la colección está vacı́a.
Implementación
En estilo TAD, y
en estilo Objeto.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Ejemplo: un tipo Colección
Tipo Colección
Tres operaciones:
agregar para añadir un elemento,
extraer para sacar un elemento, y
esVacı́a para comprobar si la colección está vacı́a.
Implementación
En estilo TAD, y
en estilo Objeto.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Implementación tipo Colección en estilo TAD (1)
Usando una pila con estado, desempaquetada. . .
local Envolver Desenvolver
{NuevoEmpacador Envolver Desenvolver}
fun {NuevaColección} {Envolver {Pila.nueva}}
end
proc {Agregar C X} S={Desenvolver C} in
{Pila.colocar S X} end
fun {Extraer C} S={Desenvolver C} in
{Pila.sacar S} end
fun {EsVacı́a C} {Pila.esVacı́a {Desenvolver C}}
end
in
Colección=colección(nueva:NuevaColección
agregar:Agregar extraer:Extraer esVacı́a:EsVacı́a)
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Implementación tipo Colección en estilo TAD (2)
Ejemplo de uso
C={Colección.nueva}
{Colección.agregar C 1}
{Colección.agregar C 2}
{Browse {Colección.extraer C}}
{Browse {Colección.extraer C}}
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Implementación tipo Colección en estilo Objeto
Usando una pila con estado, empaquetada. . .
fun {NuevaColección}
S={PilaNueva}
proc {Agregar X} {S.colocar X} end
fun {Extraer} {S.sacar} end
fun {EsVacı́a} {S.esVacı́a} end
in
colección(agregar:Agregar extraer:Extraer
esVacı́a:EsVacı́a)
end
Ejemplo de uso
C={NuevaColección}
{C.agregar 1} {C.agregar 2}
{Browse {C.extraer}}
{Browse {C.extraer}}
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo TAD (1)
Operación unión
{Colección.unión C1 C2}:todos los elementos de C2 se
agregan a C1, dejando C2 vacı́a.
Abstracción de control DoUntil
proc {DoUntil BF S}
if {BF} then skip else {S} {DoUntil BF S} end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo TAD (1)
Operación unión
{Colección.unión C1 C2}:todos los elementos de C2 se
agregan a C1, dejando C2 vacı́a.
Abstracción de control DoUntil
proc {DoUntil BF S}
if {BF} then skip else {S} {DoUntil BF S} end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo TAD (2)
Implementación de unión
local Envolver Desenvolver
...
proc {Unión C1 C2}
S1={Desenvolver C1} S2={Desenvolver C2} in
{DoUntil fun {$} {Pila.esVacı́a S2} end
proc {$} {Pila.colocar S1 {Pila.sacar S2}}
end}
end
in
Colección=colección(... unión:Unión)
end
Esta implementación utiliza tanto la representación interna de C1
como la de C2
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo TAD (3)
Implementación de unión usando sólo las interfaces
local Envolver Desenvolver
...
proc {Unión C1 C2}
{DoUntil fun {$} {Colección.esVacı́a C2} end
proc {$} {Colección.agregar C1
{Colección.extraer C2}} end}
end
in
Colección=colección(... unión:Unión)
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo TAD (4)
Ejemplo de uso
C1={Colección.nueva} C2={Colección.nueva}
for I in [1 2 3] do {Colección.agregar C1 I} end
for I in [4 5 6] do {Colección.agregar C2 I} end
{Colección.unión C1 C2}
{Browse {Colección.esVacı́a C2}}
{DoUntil fun {$} {Colección.esVacı́a C1} end
proc {$} {Browse {Colección.extraer C1}} end}
En resumen
Rep. interna ⇒ Eficiencia ∧ No polimorfismo
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo Objeto (1)
Operación unión
{C1.unión C2}:todos los elementos de C2 se agregan a C1,
dejando C2 vacı́a.
Implementación
fun {NuevaColección}
S1={PilaNueva}
...
proc {Unión C2}
{DoUntil C2.esVacı́a
proc {$} {S1.colocar {C2.extraer}} end}
end
in
colección(... unión:Unión)
end
Se usa la representación
C1, pero
la interfaz
externa de
Juan Franciscointerna
Dı́az Frias de Modelos
y Paradigmas
de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo Objeto (1)
Operación unión
{C1.unión C2}:todos los elementos de C2 se agregan a C1,
dejando C2 vacı́a.
Implementación
fun {NuevaColección}
S1={PilaNueva}
...
proc {Unión C2}
{DoUntil C2.esVacı́a
proc {$} {S1.colocar {C2.extraer}} end}
end
in
colección(... unión:Unión)
end
Se usa la representación
C1, pero
la interfaz
externa de
Juan Franciscointerna
Dı́az Frias de Modelos
y Paradigmas
de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Extensión tipo Colección en estilo Objeto (2)
Implementación de unión usando sólo las interfaces
fun {NuevaColección}
...
proc {Unión C2}
{DoUntil C2.esVacı́a
proc {$} {This.agregar {C2.extraer}} end}
end
This=colección(... unión:Unión)
in
This
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
¿Cómo escoger entre los estilos TAD y objeto?
Eficiencia
El estilo TAD puede ser más eficiente porque permite acceder a
ambas representaciones internas.
Única alternativa
Algunas veces el estilo TAD es el único que funciona: Suma de
enteros.
Polimorfismo en Objeto es “gratis”
Si D es un objeto colección con la misma interfaz de C, aunque
condiferente implementación, {C unión(D)} funciona. ¿Por qué?
Concurrencia
El estilo objeto no está limitado a objetos secuenciales: Objetos
flujo, puerto y activos.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
¿Cómo escoger entre los estilos TAD y objeto?
Eficiencia
El estilo TAD puede ser más eficiente porque permite acceder a
ambas representaciones internas.
Única alternativa
Algunas veces el estilo TAD es el único que funciona: Suma de
enteros.
Polimorfismo en Objeto es “gratis”
Si D es un objeto colección con la misma interfaz de C, aunque
condiferente implementación, {C unión(D)} funciona. ¿Por qué?
Concurrencia
El estilo objeto no está limitado a objetos secuenciales: Objetos
flujo, puerto y activos.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
¿Cómo escoger entre los estilos TAD y objeto?
Eficiencia
El estilo TAD puede ser más eficiente porque permite acceder a
ambas representaciones internas.
Única alternativa
Algunas veces el estilo TAD es el único que funciona: Suma de
enteros.
Polimorfismo en Objeto es “gratis”
Si D es un objeto colección con la misma interfaz de C, aunque
condiferente implementación, {C unión(D)} funciona. ¿Por qué?
Concurrencia
El estilo objeto no está limitado a objetos secuenciales: Objetos
flujo, puerto y activos.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
¿Cómo escoger entre los estilos TAD y objeto?
Eficiencia
El estilo TAD puede ser más eficiente porque permite acceder a
ambas representaciones internas.
Única alternativa
Algunas veces el estilo TAD es el único que funciona: Suma de
enteros.
Polimorfismo en Objeto es “gratis”
Si D es un objeto colección con la misma interfaz de C, aunque
condiferente implementación, {C unión(D)} funciona. ¿Por qué?
Concurrencia
El estilo objeto no está limitado a objetos secuenciales: Objetos
flujo, puerto y activos.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
¿Cómo escoger entre los estilos TAD y objeto? (2)
Polimorfismo en TAD implica módulos de primera clase
proc {Unión C1 Colección2 C2}
{DoUntil fun {$} {Colección2.esVacı́a C2} end
proc {$} {Colección.agregar C1
{Colección2.extraer C2}} end}
end
Colección=colección(... unión:Unión)
La implementación de unión tiene que asegurarse que C2 siempre
utilice una operación de Colección2.
Interoperabilidad en TAD
Si utilizamos el estilo TAD sin módulos de primera clase, entonces
debemos escribir código nuevo para que los tipos puedan
interoperar. Tenemos que escribir una operación unión que
conozca ambas representaciones internas.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
¿Cómo escoger entre los estilos TAD y objeto? (2)
Polimorfismo en TAD implica módulos de primera clase
proc {Unión C1 Colección2 C2}
{DoUntil fun {$} {Colección2.esVacı́a C2} end
proc {$} {Colección.agregar C1
{Colección2.extraer C2}} end}
end
Colección=colección(... unión:Unión)
La implementación de unión tiene que asegurarse que C2 siempre
utilice una operación de Colección2.
Interoperabilidad en TAD
Si utilizamos el estilo TAD sin módulos de primera clase, entonces
debemos escribir código nuevo para que los tipos puedan
interoperar. Tenemos que escribir una operación unión que
conozca ambas representaciones internas.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Otras clases de polimorfismo, distinto al universal
Polimorfismo ad-hoc
Se ejecuta código diferente para argumentos de tipos diferentes.
Por ejemplo el operador de sobrecarga.
Polimorfismo por subtipos
Se ejecuta el mismo código para todos los argumentos cuyo tipo
sea un subtipo del tipo más general. Por ejemplo, Registros, tuplas
y listas.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
Otras clases de polimorfismo, distinto al universal
Polimorfismo ad-hoc
Se ejecuta código diferente para argumentos de tipos diferentes.
Por ejemplo el operador de sobrecarga.
Polimorfismo por subtipos
Se ejecuta el mismo código para todos los argumentos cuyo tipo
sea un subtipo del tipo más general. Por ejemplo, Registros, tuplas
y listas.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Principios de la POO
El modelo de computación
El modelo de computación de la POO es el modelo con estado.
¿Qué es un programa?
Los programas son colecciones de abstracciones de datos que
interactúan entre ellas. Dos principios para construirlas:
Las abstracciones de datos deben tener estado por defecto.
El estilo objeto, por defecto, deberı́a ser el estilo APD, el cual
fomenta el polimorfismo y la herencia.
En resumen. . .
La POO es la programación con abstracción de datos en forma de
objetos, estado explı́cito, polimorfismo, y herencia.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Principios de la POO
El modelo de computación
El modelo de computación de la POO es el modelo con estado.
¿Qué es un programa?
Los programas son colecciones de abstracciones de datos que
interactúan entre ellas. Dos principios para construirlas:
Las abstracciones de datos deben tener estado por defecto.
El estilo objeto, por defecto, deberı́a ser el estilo APD, el cual
fomenta el polimorfismo y la herencia.
En resumen. . .
La POO es la programación con abstracción de datos en forma de
objetos, estado explı́cito, polimorfismo, y herencia.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Principios de la POO
El modelo de computación
El modelo de computación de la POO es el modelo con estado.
¿Qué es un programa?
Los programas son colecciones de abstracciones de datos que
interactúan entre ellas. Dos principios para construirlas:
Las abstracciones de datos deben tener estado por defecto.
El estilo objeto, por defecto, deberı́a ser el estilo APD, el cual
fomenta el polimorfismo y la herencia.
En resumen. . .
La POO es la programación con abstracción de datos en forma de
objetos, estado explı́cito, polimorfismo, y herencia.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Herencia
Observación
Muchas abstracciones de datos tienen mucho en común, v. gr. los
conjuntos. ¿Podemos implementarlas sin duplicar las partes
comunes?
Problema: duplicación de código
Programas más largos.
Se dificulta el mantenimiento: modificación de todas las
copias.
Copias ligeramente diferentes: relacion entre cambios no obvia.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Herencia
Observación
Muchas abstracciones de datos tienen mucho en común, v. gr. los
conjuntos. ¿Podemos implementarlas sin duplicar las partes
comunes?
Problema: duplicación de código
Programas más largos.
Se dificulta el mantenimiento: modificación de todas las
copias.
Copias ligeramente diferentes: relacion entre cambios no obvia.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Herencia
¿Para qué el concepto de herencia?
Para reducir el problema de la duplicación de código y para
clarificar las relaciones entre las abstracciones de datos.
¿Cómo?
Una abstracción “hereda” de otra(s), teniendo esencialmente
la misma funcionalidad que las otras, posiblemente con
algunas extensiones y modificaciones.
Sólo se especifican las diferencias entre la abstracción de
datos y sus ancestros.
A tal definición incremental de una abstracción de datos se le
denomina una clase.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Herencia
¿Para qué el concepto de herencia?
Para reducir el problema de la duplicación de código y para
clarificar las relaciones entre las abstracciones de datos.
¿Cómo?
Una abstracción “hereda” de otra(s), teniendo esencialmente
la misma funcionalidad que las otras, posiblemente con
algunas extensiones y modificaciones.
Sólo se especifican las diferencias entre la abstracción de
datos y sus ancestros.
A tal definición incremental de una abstracción de datos se le
denomina una clase.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Herencia: clase
¿Cómo se define una clase?
Por combinación de una o más clases existentes con una
descripción de las extensiones y modificaciones requeridas.
¿Concepto nuevo?
NO! Abstracción lingüı́stica.
Manipulación sintáctica, donde la sintaxis de la clase nueva se
deriva a partir de las clases originales.
Función que recibe como entrada valores de tipo clase y
devuelve como salida la clase nueva.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Herencia: clase
¿Cómo se define una clase?
Por combinación de una o más clases existentes con una
descripción de las extensiones y modificaciones requeridas.
¿Concepto nuevo?
NO! Abstracción lingüı́stica.
Manipulación sintáctica, donde la sintaxis de la clase nueva se
deriva a partir de las clases originales.
Función que recibe como entrada valores de tipo clase y
devuelve como salida la clase nueva.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Use la herencia con cuidado (1)
Conocimiento profundo de las clases ancestro
Pues ellas pueden romper fácilmente un invariante de clase.
Interfaz adicional a mantener
La capacidad de extender una clase se puede ver como una manera
adicional de interactuar con esa clase. Esta interfaz tiene que
mantenerse a lo largo de la vida del componente.
⇒
Las clases son finales (no se pueden extender) por defecto. Para
extenderlas, se requiere la acción explı́cita del programador.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Use la herencia con cuidado (1)
Conocimiento profundo de las clases ancestro
Pues ellas pueden romper fácilmente un invariante de clase.
Interfaz adicional a mantener
La capacidad de extender una clase se puede ver como una manera
adicional de interactuar con esa clase. Esta interfaz tiene que
mantenerse a lo largo de la vida del componente.
⇒
Las clases son finales (no se pueden extender) por defecto. Para
extenderlas, se requiere la acción explı́cita del programador.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Use la herencia con cuidado (2)
Factorización de una aplicación vs. dispersión de la implementación
La implementación no existe en un sitio; todas las abstracciones de
las que se hereda tienen que considerarse juntas.
Esto dificulta entender la abstracción, y, paradójicamente, puede
dificultar su mantenimiento.
Lección
La herencia debe utilizarse en “pequeñas cantidades.”
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Use la herencia con cuidado (2)
Factorización de una aplicación vs. dispersión de la implementación
La implementación no existe en un sitio; todas las abstracciones de
las que se hereda tienen que considerarse juntas.
Esto dificulta entender la abstracción, y, paradójicamente, puede
dificultar su mantenimiento.
Lección
La herencia debe utilizarse en “pequeñas cantidades.”
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Alternativa a la herencia. . .
Programación Basada en componentes
La idea es definir un componente que encapsula a otro
componente y provee una funcionalidad modificada.
Compromiso Herencia - Componentes
La herencia es más flexible pero puede romper un invariante de
clase, mientras que la composición de componentes es menos
flexible pero no puede romper un invariante de componente.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Alternativa a la herencia. . .
Programación Basada en componentes
La idea es definir un componente que encapsula a otro
componente y provee una funcionalidad modificada.
Compromiso Herencia - Componentes
La herencia es más flexible pero puede romper un invariante de
clase, mientras que la composición de componentes es menos
flexible pero no puede romper un invariante de componente.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Conjunto de conceptos para definir clases
Para construir abstracciones de datos completas
Los métodos, los atributos, y las propiedades.
Mensajes de primera clase y atributos de primera clase: para
lograr formas poderosas de polimorfismo.
Para construir abstracciones de datos incrementalmente
Los conceptos relacionados con la herencia, i.e., los que definen
cómo se relaciona una clase con las clases existentes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Conjunto de conceptos para definir clases
Para construir abstracciones de datos completas
Los métodos, los atributos, y las propiedades.
Mensajes de primera clase y atributos de primera clase: para
lograr formas poderosas de polimorfismo.
Para construir abstracciones de datos incrementalmente
Los conceptos relacionados con la herencia, i.e., los que definen
cómo se relaciona una clase con las clases existentes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: sintaxis
Supuestos
class Contador
attr val
meth inic(Valor)
val:=Valor
end
meth browse
{Browse @val}
end
meth inc(Valor)
val:=@val+Valor
end
end
class: constructor nuevo.
Las clases son valores de primera clase.
class es una abstracción lingüı́stica.
Sintácticamente:
Juan Francisco Dı́az Frias
Nombre Contador (podrı́a ser
anónima).
Atributos: val.
Métodos: inic, browse, e inc.
Operadores: := y @.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: sintaxis
Supuestos
class Contador
attr val
meth inic(Valor)
val:=Valor
end
meth browse
{Browse @val}
end
meth inc(Valor)
val:=@val+Valor
end
end
class: constructor nuevo.
Las clases son valores de primera clase.
class es una abstracción lingüı́stica.
Sintácticamente:
Juan Francisco Dı́az Frias
Nombre Contador (podrı́a ser
anónima).
Atributos: val.
Métodos: inic, browse, e inc.
Operadores: := y @.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: sintaxis
Supuestos
class Contador
attr val
meth inic(Valor)
val:=Valor
end
meth browse
{Browse @val}
end
meth inc(Valor)
val:=@val+Valor
end
end
class: constructor nuevo.
Las clases son valores de primera clase.
class es una abstracción lingüı́stica.
Sintácticamente:
Juan Francisco Dı́az Frias
Nombre Contador (podrı́a ser
anónima).
Atributos: val.
Métodos: inic, browse, e inc.
Operadores: := y @.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
¿Es la diferencia con otros lenguajes sólo sintáctica?
Las apariencias engañan
La declaración se ejecuta en tiempo de ejecución: se crea un
valor de tipo clase y se liga a la variable Contador.
La declaración al principio del programa se comporta
familiarmente.
Pero, la declaración puede colocarse en cualquier sitio donde
pueda ir una declaración. Por ejemplo, si se coloca la
declaración dentro de un procedimiento, se creará una clase
nueva, distinta, cada vez que se invoca el procedimiento.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Ejemplo de uso
C={New Contador inic(0)}
{C inc(6)} {C inc(6)}
{C browse}
local X in {C inc(X)} X=5
end
{C browse}
Juan Francisco Dı́az Frias
declare S in
local X in
thread {C inc(X)} S=listo
end
X=5
end
{Wait S} {C browse}
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: semántica (1)
local
proc {Inic M S}
inic(Valor)=M in (S.val):=Valor
end
proc {Browse2 M S}
{Browse @(S.val)}
end
proc {Inc M S}
inc(Valor)=M in
(S.val):=@(S.val)+Valor
end
in
Contador=c(atrbs:[val]
métodos:m(inic:Inic
browse:Browse2 inc:Inc))
end
Juan Francisco Dı́az Frias
Detalles
Una clase es un
registro: nombres
de atributos;
métodos.
Nombre de
atributo: literal.
Método:
procedimiento de
dos argumentos:
mensaje y estado.
Asignación val:= y
acceso @val.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: semántica (1)
local
proc {Inic M S}
inic(Valor)=M in (S.val):=Valor
end
proc {Browse2 M S}
{Browse @(S.val)}
end
proc {Inc M S}
inc(Valor)=M in
(S.val):=@(S.val)+Valor
end
in
Contador=c(atrbs:[val]
métodos:m(inic:Inic
browse:Browse2 inc:Inc))
end
Juan Francisco Dı́az Frias
Detalles
Una clase es un
registro: nombres
de atributos;
métodos.
Nombre de
atributo: literal.
Método:
procedimiento de
dos argumentos:
mensaje y estado.
Asignación val:= y
acceso @val.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: semántica (2)
fun {New Clase Inic}
Fs={Map Clase.atrbs fun {$ X}
X#{NewCell _} end}
S={List.toRecord estado Fs}
proc {Obj M}
{Clase.métodos.{Label M} M S}
end
in
{Obj Inic}
Obj
end
Juan Francisco Dı́az Frias
La función New
Crea el estado del
objeto.
Define Obj que es
de hecho el objeto.
Inicializa el objeto
antes de devolverlo.
Estado: registro S,
oculto dentro de
Obj.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Un ejemplo de clase: semántica (2)
fun {New Clase Inic}
Fs={Map Clase.atrbs fun {$ X}
X#{NewCell _} end}
S={List.toRecord estado Fs}
proc {Obj M}
{Clase.métodos.{Label M} M S}
end
in
{Obj Inic}
Obj
end
Juan Francisco Dı́az Frias
La función New
Crea el estado del
objeto.
Define Obj que es
de hecho el objeto.
Inicializa el objeto
antes de devolverlo.
Estado: registro S,
oculto dentro de
Obj.
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Sintaxis de clase (1)
hdeclaracióni ::= class hvariablei { hdescriptorClasei }
{ meth hcabezaMétodoi [ ´=´ hvariablei ]
( hexpresiónEni | hdeclaraciónEni ) end }
|
|
|
|
end
lock [ hexpresióni then ] hdeclaraciónEni end
hexpresióni ´:=´ hexpresióni
hexpresióni ´,´ hexpresióni
...
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Sintaxis de clase (2)
hexpresióni ::= class ´$´ { hdescriptorClasei }
{ meth hcabezaMétodoi [ ´=´ hvariablei ]
( hexpresiónEni | hdeclaraciónEni ) end }
end
| lock [ hexpresióni then ] hexpresiónEni end
| hexpresióni ´:=´ hexpresióni
| hexpresióni ´,´ hexpresióni
| ´@´ hexpresióni
| self
| ...
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Sintaxis de clase (3)
hdescriptorClasei ::= from { hexpresióni }+ | prop { hexpresióni }+
| attr { hinicAtrbi }+
hinicAtrbi
::= ( [ ´!´ ] hvariablei | hátomoi | unit | true | false )
[ ´:´ hexpresióni ]
hcabezaMétodoi ::= ( [ ´!´ ] hvariablei | hátomoi | unit | true | false )
[ ´(´ { hargMétodoi } [ ´...´ ] ´)´ ]
[ ´=´ hvariablei ]
hargMétodoi
::= [ hfeaturei ´:´ ] ( hvariablei | ´_´ | ´$´ ) [ ´<=´ hexpresióni ]
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Sintaxis de clase (4)
Caracterı́sticas
Número de objetos ilimitado.
Objeto ≡ instancia. Cada instancia
tiene identidad única.
¿Qué es una clase?
Una clase es una estructura de
Cada objeto se comporta según la
datos que define un estado
definición de clase.
interno de un objeto
(atributos), su
Creación, invocación
comportamiento (métodos),
MiObj={New MiClase Inic}
las clases de las cuales hereda,
y otras propiedades y
crea un objeto MiObj, de la clase MiClase
operaciones.
e invoca el objeto con el mensaje Inic.
Con la sintaxis {MiObj M} se invoca el
objeto.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Sintaxis de clase (4)
Caracterı́sticas
Número de objetos ilimitado.
Objeto ≡ instancia. Cada instancia
tiene identidad única.
¿Qué es una clase?
Una clase es una estructura de
Cada objeto se comporta según la
datos que define un estado
definición de clase.
interno de un objeto
(atributos), su
Creación, invocación
comportamiento (métodos),
MiObj={New MiClase Inic}
las clases de las cuales hereda,
y otras propiedades y
crea un objeto MiObj, de la clase MiClase
operaciones.
e invoca el objeto con el mensaje Inic.
Con la sintaxis {MiObj M} se invoca el
objeto.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Sintaxis de clase (4)
Caracterı́sticas
Número de objetos ilimitado.
Objeto ≡ instancia. Cada instancia
tiene identidad única.
¿Qué es una clase?
Una clase es una estructura de
Cada objeto se comporta según la
datos que define un estado
definición de clase.
interno de un objeto
(atributos), su
Creación, invocación
comportamiento (métodos),
MiObj={New MiClase Inic}
las clases de las cuales hereda,
y otras propiedades y
crea un objeto MiObj, de la clase MiClase
operaciones.
e invoca el objeto con el mensaje Inic.
Con la sintaxis {MiObj M} se invoca el
objeto.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Miembros de una clase (1)
Atributos: palabra reservada “attr”
O variables de instancia: celda que contiene parte del estado de la
instancia.
Operaciones:
hexpri1 :=hexpri2
@hexpri
hexpri3 =hexpri1 :=hexpri2 .
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Miembros de una clase (2)
Métodos: palabra reservada “meth”
Procedimiento que se invoca en el contexto de un objeto particular
y que tiene acceso a los atributos del objeto.
Consta de una cabeza y un cuerpo.
La cabeza consta de una etiqueta, la cual debe ser un átomo
o un nombre, y de un conjunto de argumentos.
Los argumentos deben ser variables diferentes; de otra manera
serı́a un error de sintaxis.
Cabeza≡Patrón y Mensaje≡Registro.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Miembros de una clase (3)
Propiedades: palabra reservada “prop”
Una propiedad modifica cómo se comporta un objeto:
La propiedad locking crea un candado nuevo con cada
instancia de objeto.
La propiedad final hace que la clase sea una clase final
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Miembros de una clase (4)
Atributos como átomos o como identificadores
Las etiquetas de los atributos y de los métodos son literales.
Si se definen utilizando la sintaxis de átomo, entonces son
átomos.
Si se definen con la sintaxis de identificadores (e.g., en
mayúscula), entonces el sistema creará nombres nuevos para
ellos, cuyo alcance es la definición de la clase.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Inicialización de atributos (1)
Inicialización por instancia
Un atributo puede tener un valor inicial diferente para cada
instancia. Esto se logra no inicializándolos en la definición de clase.
Ejemplo
class UnApart
attr nombreCalle
meth inic(X) @nombreCalle=X end
end
Apt1={New UnApart inic(pasoancho)}
Apt2={New UnApart inic(calleQuinta)}
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Inicialización de atributos (2)
Inicialización por clase
Un atributo puede tener un valor que sea el mismo para todas las
instancias de la clase. Esto se hace, inicializándolo con “:” en la
definición de clase.
Ejemplo
class ApartQuinta
attr
nombreCalle:calleQuinta
númeroCalle:100
colorPared:_
superficiePiso:madera
meth inic skip end
end
Apt3={New ApartQuinta inic}
Apt4={New ApartQuinta inic}
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Inicialización de atributos (3)
Inicialización por marca
Esta es otra manera de utilizar la inicialización por clase. Una
marca es un conjunto de clases relacionadas de alguna manera,
pero no por herencia.
Ejemplo
L=linux
class RedHat attr tiposo:L end
class SuSE attr tiposo:L end
class Debian attr tiposo:L end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Mensajes de primera clase (1)
Principio
Los mensajes son registros y las cabezas de los métodos son
patrones que reconocen un registro.
Invocación de objeto {Obj M}
Registro estático como mensaje. En el caso más sencillo, M es
un registro que se conoce en tiempo de compilación, e.g.,
como en la invocación {Contador inc(X)}.
Registro dinámico como mensaje. Es posible invocar {Obj M}
donde M es una variable que referencia un registro que se
calcula en tiempo de ejecución. Como el tipamiento es
dinámico, es posible crear nuevos tipos de registros en tiempo
de ejecución (e.g., con Adjoin o List.toRecord).
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Mensajes de primera clase (1)
Principio
Los mensajes son registros y las cabezas de los métodos son
patrones que reconocen un registro.
Invocación de objeto {Obj M}
Registro estático como mensaje. En el caso más sencillo, M es
un registro que se conoce en tiempo de compilación, e.g.,
como en la invocación {Contador inc(X)}.
Registro dinámico como mensaje. Es posible invocar {Obj M}
donde M es una variable que referencia un registro que se
calcula en tiempo de ejecución. Como el tipamiento es
dinámico, es posible crear nuevos tipos de registros en tiempo
de ejecución (e.g., con Adjoin o List.toRecord).
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Mensajes de primera clase (2)
Definición de un método (1)
Lista fija de argumentos:
meth foo(a:A b:B c:C)
% Cuerpo del método
end
Lista flexible de argumentos:
meth foo(a:A b:B c:C ...)
% Cuerpo del método
end
Referencia variable a la cabeza del método:
meth foo(a:A b:B c:C ...)=M
% Cuerpo del método
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Mensajes de primera clase (3)
Definición de un método (2)
Argumento opcional:valor por defecto, se usa sólo si el
argumento no viene en el mensaje.
meth foo(a:A b:B<=V)
% Cuerpo del método
end
foo(a:1 b:2) ignora V, foo(a:1) ≡ foo(a:1 b:V)
Etiqueta privada de método: A se liga a un nombre fresco
cuando se define la clase.
meth A(bar:X)
% Cuerpo del método
end
Etiqueta dinámica de método:
meth !A(bar:X)
% Cuerpo del método
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Mensajes de primera clase (4)
Definición de un método (3)
Etiqueta dinámica de método:
meth !A(bar:X)
% Cuerpo del método
end
La etiqueta del método debe ser conocida en el momento en
que la definición de clase sea ejecutada.
El método otherwise: acepta cualquier mensaje para el cual
no exista ningún otro método.
meth otherwise(M)
% Cuerpo del método
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
¿Cómo hace el compilador con la invocación
{Obj M}?
Estáticamente . . .
Determinar Obj y M. Si puede, compila a una instrucción muy
rápida y especializada.
Si no puede . . .
Compila a un instrucción general de invocación de un objeto.
La instrucción general utiliza el ocultamiento.
La primera invocación es lenta, pero las subsiguientes son casi
tan rápidas como las invocaciones especializadas.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Plan
1
Recorderis: Abstracción de datos
TADs
El estilo Objeto
Polimorfismo
Ejemplo: un tipo Colección
2
Principios de la POO
3
Herencia
4
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Tres conjuntos de conceptos para la herencia:
Grafo de herencia
Define cuáles clases preexistentes se extenderán. Se permitirá tanto
herencia sencilla como herencia múltiple.
Control de acceso a los métodos
Define cómo se accede a los métodos en particular, tanto en la
clase nueva como en las clases preexistentes. Esto se logra con
ligaduras estática y dinámica y con el concepto de self.
Control de la encapsulación
Define qué parte de un programa puede ver los atributos y
métodos de una clase.
Otros conceptos . . .
Reenvı́o, delegación, y reflexión.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Tres conjuntos de conceptos para la herencia:
Grafo de herencia
Define cuáles clases preexistentes se extenderán. Se permitirá tanto
herencia sencilla como herencia múltiple.
Control de acceso a los métodos
Define cómo se accede a los métodos en particular, tanto en la
clase nueva como en las clases preexistentes. Esto se logra con
ligaduras estática y dinámica y con el concepto de self.
Control de la encapsulación
Define qué parte de un programa puede ver los atributos y
métodos de una clase.
Otros conceptos . . .
Reenvı́o, delegación, y reflexión.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Tres conjuntos de conceptos para la herencia:
Grafo de herencia
Define cuáles clases preexistentes se extenderán. Se permitirá tanto
herencia sencilla como herencia múltiple.
Control de acceso a los métodos
Define cómo se accede a los métodos en particular, tanto en la
clase nueva como en las clases preexistentes. Esto se logra con
ligaduras estática y dinámica y con el concepto de self.
Control de la encapsulación
Define qué parte de un programa puede ver los atributos y
métodos de una clase.
Otros conceptos . . .
Reenvı́o, delegación, y reflexión.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Tres conjuntos de conceptos para la herencia:
Grafo de herencia
Define cuáles clases preexistentes se extenderán. Se permitirá tanto
herencia sencilla como herencia múltiple.
Control de acceso a los métodos
Define cómo se accede a los métodos en particular, tanto en la
clase nueva como en las clases preexistentes. Esto se logra con
ligaduras estática y dinámica y con el concepto de self.
Control de la encapsulación
Define qué parte de un programa puede ver los atributos y
métodos de una clase.
Otros conceptos . . .
Reenvı́o, delegación, y reflexión.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (1)
Disponibilidad de métodos y atributos
La herencia es una forma de construir clases nuevas a partir de
clases existentes.
La herencia define qué atributos y métodos están disponibles en la
clase nueva.
Relación de precedencia: Relación de anulación
Un método (atributo) en la clase C anula cualquier método
(atributo) con la misma etiqueta (el mismo nombre) en todas las
superclases de C.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (1)
Disponibilidad de métodos y atributos
La herencia es una forma de construir clases nuevas a partir de
clases existentes.
La herencia define qué atributos y métodos están disponibles en la
clase nueva.
Relación de precedencia: Relación de anulación
Un método (atributo) en la clase C anula cualquier método
(atributo) con la misma etiqueta (el mismo nombre) en todas las
superclases de C.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (2)
Tipos de herencia
Herencia sencilla (se hereda de una sola clase) o Herencia múltiple
(se hereda de varias clases. Sintácticamente: from.
Superclases
Una clase B es una superclase de la clase A si
B aparece en la parte from de la declaración de A, o
B es una superclase de una clase que aparece en la parte from
de la declaración de A.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (2)
Tipos de herencia
Herencia sencilla (se hereda de una sola clase) o Herencia múltiple
(se hereda de varias clases. Sintácticamente: from.
Superclases
Una clase B es una superclase de la clase A si
B aparece en la parte from de la declaración de A, o
B es una superclase de una clase que aparece en la parte from
de la declaración de A.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (3)
Jerarquı́a de clases
Grafo dirigido de la relación de superclase cuya raı́z es la clase
actual. Las aristas son dirigidas hacia las subclases.
Legalidad de la herencia
La relación de herencia es dirigida y acı́clica.
class A from B ... end
class B from A ... end
Cada método (salvo los anulados) debe tener una etiqueta
única y debe estar definido en una sola clase en la jerarquı́a.
class
class
class
class
class
A1 meth m(...) ... end end
B1 meth m(...) ... end end
A from A1 end
B from B1 end
C from A B end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (3)
Jerarquı́a de clases
Grafo dirigido de la relación de superclase cuya raı́z es la clase
actual. Las aristas son dirigidas hacia las subclases.
Legalidad de la herencia
La relación de herencia es dirigida y acı́clica.
class A from B ... end
class B from A ... end
Cada método (salvo los anulados) debe tener una etiqueta
única y debe estar definido en una sola clase en la jerarquı́a.
class
class
class
class
class
A1 meth m(...) ... end end
B1 meth m(...) ... end end
A from A1 end
B from B1 end
C from A B end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (4)
Método m
A1
m
A
B1
m
B
A1
A
C
m
m
B1
B
C
Jerarquía de clases ilegal
Jerarquía de clases legal
(dos ‘‘m’’ visibles desde C)
(un ‘‘m’’ visible desde C)
También es ilegal . . .
class A meth m(...) ... end end
class B meth m(...) ... end end
class C from A B end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (4)
Método m
A1
m
A
B1
m
B
A1
A
C
m
m
B1
B
C
Jerarquía de clases ilegal
Jerarquía de clases legal
(dos ‘‘m’’ visibles desde C)
(un ‘‘m’’ visible desde C)
También es ilegal . . .
class A meth m(...) ... end end
class B meth m(...) ... end end
class C from A B end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (5)
¿Cuando se detecta un error de estos?
fun {ClaseExtraña}
class A meth foo(X) X=a end end
class B meth foo(X) X=b end end
class C from A B end
in C end
Principio:todo se hace en tiempo de ejecución
ClaseExtraña se puede compilar y ejecutar exitosamente. Sólo se
lanzará una excepción en la invocación {ClaseExtraña}.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Grafo de herencia (5)
¿Cuando se detecta un error de estos?
fun {ClaseExtraña}
class A meth foo(X) X=a end end
class B meth foo(X) X=b end end
class C from A B end
in C end
Principio:todo se hace en tiempo de ejecución
ClaseExtraña se puede compilar y ejecutar exitosamente. Sólo se
lanzará una excepción en la invocación {ClaseExtraña}.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (1)
Búsqueda del método correcto
¿Cuando se invoca un método de un objeto: cuál método se
ejecuta? Esto parece bastante sencillo, pero se vuelve ligeramente
más complicado cuando está involucrada la herencia.
Ligadura estática y dinámica
La herencia se utiliza para definir una clase nueva que extiende una
clase existente. Ambas clases pueden tener métodos con el mismo
nombre, y la clase nueva puede querer invocar cualquiera de ellos.
Se necesitan dos maneras de invocar: ligadura estática y ligadura
dinámica.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (1)
Búsqueda del método correcto
¿Cuando se invoca un método de un objeto: cuál método se
ejecuta? Esto parece bastante sencillo, pero se vuelve ligeramente
más complicado cuando está involucrada la herencia.
Ligadura estática y dinámica
La herencia se utiliza para definir una clase nueva que extiende una
clase existente. Ambas clases pueden tener métodos con el mismo
nombre, y la clase nueva puede querer invocar cualquiera de ellos.
Se necesitan dos maneras de invocar: ligadura estática y ligadura
dinámica.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (2)
Ejemplo de clase: Cuenta
class Cuenta
attr saldo:0
meth transferir(Cant)
saldo:=@saldo+Cant
end
meth pedirSaldo(Sal)
Sal=@saldo
end
meth transferEnLote(CantList)
for A in CantList do {self transferir(A)} end
end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (3)
Extensión de Cuenta
class CuentaVigilada from Cuenta
meth transferir(Cant)
{LogObj agregueEntrada(transferir(Cant))}
...
end
end
Creación e invocación
CtaVig={New CuentaVigilada transferir(100)}
¿qué pasa cuando invocamos transferEnLote?
¿Se invoca transferir de Cuenta o transferir de
CuentaVigilada?
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (3)
Extensión de Cuenta
class CuentaVigilada from Cuenta
meth transferir(Cant)
{LogObj agregueEntrada(transferir(Cant))}
...
end
end
Creación e invocación
CtaVig={New CuentaVigilada transferir(100)}
¿qué pasa cuando invocamos transferEnLote?
¿Se invoca transferir de Cuenta o transferir de
CuentaVigilada?
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (4)
¿Cuál deberı́a invocarse?
transferir de CuentaVigilada.
Esto se denomina ligadura dinámica: {self transferir(A)}.
Ligadura dinámica: necesidad
Se conserva la funcionalidad de la anterior abstracción al tiempo
que se añade una funcionalidad nueva.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (4)
¿Cuál deberı́a invocarse?
transferir de CuentaVigilada.
Esto se denomina ligadura dinámica: {self transferir(A)}.
Ligadura dinámica: necesidad
Se conserva la funcionalidad de la anterior abstracción al tiempo
que se añade una funcionalidad nueva.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (5)
Ligadura dinámica: limitación
class CuentaVigilada from Cuenta
meth transferir(Cant)
{LogObj agregueEntrada(transferir(Cant))}
Cuenta,transferir(Cant)
end
end
Dentro del nuevo método transferir, tenemos que invocar el
antiguo método transferir. ¿Podemos usar ligadura dinámica?
Ligadura estática:necesidad
Invocamos un método señalando la clase del método:
Cuenta,transferir(Cant)
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (5)
Ligadura dinámica: limitación
class CuentaVigilada from Cuenta
meth transferir(Cant)
{LogObj agregueEntrada(transferir(Cant))}
Cuenta,transferir(Cant)
end
end
Dentro del nuevo método transferir, tenemos que invocar el
antiguo método transferir. ¿Podemos usar ligadura dinámica?
Ligadura estática:necesidad
Invocamos un método señalando la clase del método:
Cuenta,transferir(Cant)
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (6)
Ligadura dinámica y estática
La ligadura dinámica permite a la clase nueva extender
correctamente la clase antigua dejando que los métodos
antiguos invoquen los métodos nuevos, aunque los métodos
nuevos no existan en el momento en que los métodos antiguos
se definen.
La ligadura estática permite que los nuevos métodos invoquen
los métodos antiguos cuando tengan que hacerlo.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (7)
Resumen ligadura dinámica
Se escribe {self M}. Este tipo de ligadura escoge el
correspondiente método M visible en el objeto actual, tomando en
cuenta la anulación que haya sido realizada.
Resumen ligadura estática
Se escribe C, M (con una coma), donde C es una clase donde se
define el correspondiente método M. Este tipo de ligadura escoge el
método M visible en la clase C, tomando en cuenta las anulaciones
de métodos desde la clase raı́z hasta la clase C, pero no más.
Si el objeto es de una subclase de C que ha anulado el método M
de nuevo, entonces ésta anulación no es tenida en cuenta.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de acceso a los métodos (7)
Resumen ligadura dinámica
Se escribe {self M}. Este tipo de ligadura escoge el
correspondiente método M visible en el objeto actual, tomando en
cuenta la anulación que haya sido realizada.
Resumen ligadura estática
Se escribe C, M (con una coma), donde C es una clase donde se
define el correspondiente método M. Este tipo de ligadura escoge el
método M visible en la clase C, tomando en cuenta las anulaciones
de métodos desde la clase raı́z hasta la clase C, pero no más.
Si el objeto es de una subclase de C que ha anulado el método M
de nuevo, entonces ésta anulación no es tenida en cuenta.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (1)
Principio
Limitar el acceso a los miembros de la clase, a saber, atributos y
métodos, de acuerdo a los requerimientos de la arquitectura de la
aplicación.
Alcance de un miembro
Cada miembro se define con un alcance: El alcance es la parte del
texto del programa en el cual el miembro es visible, i.e., donde, al
mencionar su nombre, se accede a él.
Tipos de alcance
Por defecto, o modificado por palabras reservadas como public,
private, y protected.
Cada lenguaje usa estos alcances con significados ligeramente
diferentes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (1)
Principio
Limitar el acceso a los miembros de la clase, a saber, atributos y
métodos, de acuerdo a los requerimientos de la arquitectura de la
aplicación.
Alcance de un miembro
Cada miembro se define con un alcance: El alcance es la parte del
texto del programa en el cual el miembro es visible, i.e., donde, al
mencionar su nombre, se accede a él.
Tipos de alcance
Por defecto, o modificado por palabras reservadas como public,
private, y protected.
Cada lenguaje usa estos alcances con significados ligeramente
diferentes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (1)
Principio
Limitar el acceso a los miembros de la clase, a saber, atributos y
métodos, de acuerdo a los requerimientos de la arquitectura de la
aplicación.
Alcance de un miembro
Cada miembro se define con un alcance: El alcance es la parte del
texto del programa en el cual el miembro es visible, i.e., donde, al
mencionar su nombre, se accede a él.
Tipos de alcance
Por defecto, o modificado por palabras reservadas como public,
private, y protected.
Cada lenguaje usa estos alcances con significados ligeramente
diferentes.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (2)
Alcance privado
Un miembro privado es aquel que sólo es visible en la instancia
correspondiente al objeto. Esta instancia puede ver todos los
miembros definidos en su clase y en sus superclases. Visibilidad
vertical.
Alcance público
Un miembro público es aquel que es visible en cualquier parte del
programa.
¿Qué es lo natural?
Que los atributos sean privados y los métodos sean públicos, como
en Oz y Smalltalk.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (2)
Alcance privado
Un miembro privado es aquel que sólo es visible en la instancia
correspondiente al objeto. Esta instancia puede ver todos los
miembros definidos en su clase y en sus superclases. Visibilidad
vertical.
Alcance público
Un miembro público es aquel que es visible en cualquier parte del
programa.
¿Qué es lo natural?
Que los atributos sean privados y los métodos sean públicos, como
en Oz y Smalltalk.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (2)
Alcance privado
Un miembro privado es aquel que sólo es visible en la instancia
correspondiente al objeto. Esta instancia puede ver todos los
miembros definidos en su clase y en sus superclases. Visibilidad
vertical.
Alcance público
Un miembro público es aquel que es visible en cualquier parte del
programa.
¿Qué es lo natural?
Que los atributos sean privados y los métodos sean públicos, como
en Oz y Smalltalk.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (3)
Atributos privados
Los atributos son internos a la abstracción de datos y deben ser
invisibles desde el exterior.
Métodos públicos
Los métodos conforman la interfaz externa de la abstracción de
datos, por lo tanto deberı́an ser visibles para todas las entidades
que referencian la abstracción.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (3)
Atributos privados
Los atributos son internos a la abstracción de datos y deben ser
invisibles desde el exterior.
Métodos públicos
Los métodos conforman la interfaz externa de la abstracción de
datos, por lo tanto deberı́an ser visibles para todas las entidades
que referencian la abstracción.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (4)
Dos conceptos básicos para controlar la encapsulación
Alcance léxico y valores de tipo nombre. Con ellos se implementa:
Alcane público.
Alcance privado.
Alcance privado y protegido de C++ y Java.
Técnica fundamental
La técnica fundamental es permitir que las cabezas de los métodos
sean valores de tipo nombre en lugar de átomos.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (4)
Dos conceptos básicos para controlar la encapsulación
Alcance léxico y valores de tipo nombre. Con ellos se implementa:
Alcane público.
Alcance privado.
Alcance privado y protegido de C++ y Java.
Técnica fundamental
La técnica fundamental es permitir que las cabezas de los métodos
sean valores de tipo nombre en lugar de átomos.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (5)
Métodos privados (en el sentido de C++ y Java)
=
Jerarquía de clases
C
Región de visibilidad para
el objeto I3: todos los atributos
privados en esta región
son visibles para I3
‘‘private’’ de acuerdo a
Smalltalk and Oz
SubC
SubSubC
...
Instancias
I1
I2
I3
...
Juan Francisco Dı́az Frias
In
‘‘private’’ de acuerdo a
C++ and Java
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (6)
Implementación vı́a nombres (1)
Utilizando un identificador de variable como la cabeza del método.
class C
meth A(X)
% Cuerpo del método
end
end
Implementación vı́a nombres (2)
local
A={NewName}
in
class C
meth !A(X)
% Cuerpo del método
end Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (6)
Implementación vı́a nombres (1)
Utilizando un identificador de variable como la cabeza del método.
class C
meth A(X)
% Cuerpo del método
end
end
Implementación vı́a nombres (2)
local
A={NewName}
in
class C
meth !A(X)
% Cuerpo del método
end Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (7)
Métodos protegidos (en el sentido de C++)
En C++, un método protegido solamente es accesible desde la
clase donde fue definido o en las clases descendientes (y en todas
las instancias de objetos de esas clases).
Implementación
class C
attr pa:A
meth A(X) skip end
meth foo(...) {self A(5)} end
end
class C1 from C
meth b(...) A=@pa in {self A(5)} end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (7)
Métodos protegidos (en el sentido de C++)
En C++, un método protegido solamente es accesible desde la
clase donde fue definido o en las clases descendientes (y en todas
las instancias de objetos de esas clases).
Implementación
class C
attr pa:A
meth A(X) skip end
meth foo(...) {self A(5)} end
end
class C1 from C
meth b(...) A=@pa in {self A(5)} end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (8)
Átomos o nombres como cabezas de métodos
Los átomos son visibles a través de todo el programa y los
nombres sólo son visibles en el alcance léxico de su creación.
Use nombres para métodos internos, y use átomos para
métodos externos.
¿Cómo lo hacen los lenguajes más populares?
Smalltalk, C++, y Java sólo soportan átomos como cabezas de
métodos; no tienen soporte para los nombres.
El enfoque basado en nombres no es popular todavı́a.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (8)
Átomos o nombres como cabezas de métodos
Los átomos son visibles a través de todo el programa y los
nombres sólo son visibles en el alcance léxico de su creación.
Use nombres para métodos internos, y use átomos para
métodos externos.
¿Cómo lo hacen los lenguajes más populares?
Smalltalk, C++, y Java sólo soportan átomos como cabezas de
métodos; no tienen soporte para los nombres.
El enfoque basado en nombres no es popular todavı́a.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Control de encapsulación (9)
Sencillez de los átomos
Los átomos se identifican únicamente por sus representaciones
impresas.
Con los nombres esto es más difı́cil: el programa mismo tiene
que pasar de alguna manera el nombre a quien desea invocar
el método.
Ventajas de los nombres
Imposible tener conflictos con la herencia (sencilla o múltiple).
La encapsulación se puede manejar mejor, pues una referencia
a un objeto no da necesariamente derecho a invocar los
métodos del objeto.
Los nombres pueden tener soporte sintáctico para simplificar
su uso.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (1)
Herencia
Delegación
Reenvío
definida sobre clases
definida sobre objetos
definida sobre objetos
self común
self común
self no es común
Relación estrecha entre el objeto/clase original Relación menos estrecha
y el objeto/clase derivado
Enfoque ‘‘estático’’:
al momento de la definición de la clase
Juan Francisco Dı́az Frias
Enfoques ‘‘dinámicos’’:
al momento de la creación del objeto
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (2)
Reenvı́o - Implementación
local
class MezclarReenvı́o
attr Reenvı́o:ninguno
meth asgnReenvı́o(F) Reenvı́o:=F end
meth otherwise(M)
if @Reenvı́o==ninguno then raise
métodoIndefinido end
else {@Reenvı́o M} end
end
end
in
fun {NewF Clase Inic}
{New class $ from Clase MezclarReenvı́o end
Inic}
end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (3)
Reenvı́o - Utilización
class C1
meth inic skip end
meth cubo(A B) B=A*A*A end
end
class C2
meth inic skip end
meth cuadrado(A B) B=A*A end
end
Obj1={NewF C1 inic}
Obj2={NewF C2 inic}
{Obj2 asgnReenvı́o(Obj1)}
Invocar {Obj2 cubo(10 X)} llevará a Obj2 a reenviar el mensaje
a Obj1.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (4)
Delegación
Jerarquı́a entre objetos y no entre clases.
Un objeto no hereda de una clase, sino que delega a otro
objeto.
Los mismos efectos de la herencia, pero la jerarquı́a se puede
cambiar en cualquier momento.
{Obj2 asgnDelegado(Obj1)} configura a Obj2 para
delegar en Obj1. Obj1 se comporta como la “superclase” de
Obj2.
El self se preserva siempre: es el self del objeto original
que inició la cadena de delegación. Entonces, el estado del
objeto (los atributos) también es el estado del objeto original.
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (5)
Delegación - Implementación (1)
local
AsgnSelf={NewName}
class MezclarDelegación
attr this Delegado:ninguno
meth !AsgnSelf(S) this:=S end
meth asgn(A X) A:=X end
meth obt(A ?X) X=@A end
meth asgnDelegado(D) Delegado:=D end
meth Del(M S) SS in
SS=@this this:=S
try {self M} finally this:=SS end
end
...
end
in
...
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (6)
Delegación Implementación (2)
local
AsgnSelf={NewName}
class MezclarDelegación
...
meth invcr(M) SS in
SS=@this this:=self
try {self M} finally this:=SS end
end
meth otherwise(M)
if @Delegado==ninguno then
raise métodoIndefinido end
else
{@Delegado Del(M @this)}
end
end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (7)
Delegación Implementación (3)
local
AsgnSelf={NewName}
class MezclarDelegación
...
end
in
fun {NewD Clase Inic}
Obj={New class $ from Clase MezclarDelegación
end Inic}
in
{Obj AsgnSelf(Obj)}
Obj
end
end
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (8)
Delegación - Utilización (1)
Operación
Invocación de objeto
Invocación de Self
Consulta atributo
Modificación atributo
Definición del delegado
Sintaxis original
{hobji M}
Sintaxis de delegación
{hobji invcr(M)}
{self M}
@hattri
hattri:=X
{@this M}
{@this obt(hattri $)}
{@this asgn(hattri X)}
{hobji1 asgnDelegado(hobji2 )}
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (9)
Delegación - Utilización (2)
class C1
attr i:0
meth inic skip end
meth inc(I)
{@this asgn(i {@this obt(i $)}+I)}
end
meth browse
{@this inc(10)}
{Browse c1#{@this obt(i $)}}
end
meth c {@this browse} end
end
Obj1={NewD C1 inic}
Juan Francisco Dı́az Frias
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (9)
Delegación - Utilización (3)
class C2
attr i:0
meth inic skip end
meth browse
{@this inc(100)}
{Browse c2#{@this
obt(i $)}}
end
end
Obj2={NewD C2 inic}
{Obj2 asgnDelegado(Obj1)}
Juan Francisco Dı́az Frias
Delegación - Utilización (4)
{Obj2 invcr(c)}
{Obj1 invcr(c)}
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (9)
Delegación - Utilización (3)
class C2
attr i:0
meth inic skip end
meth browse
{@this inc(100)}
{Browse c2#{@this
obt(i $)}}
end
end
Obj2={NewD C2 inic}
{Obj2 asgnDelegado(Obj1)}
Juan Francisco Dı́az Frias
Delegación - Utilización (4)
{Obj2 invcr(c)}
{Obj1 invcr(c)}
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (10)
Delegación - Utilización (5)
class C2b
attr i:0
meth inic skip end
end
ObjX={NewD C2b inic}
{ObjX asgnDelegado(Obj2)}
Juan Francisco Dı́az Frias
Delegación - Utilización (6)
{ObjX asgnDelegado(Obj1)}
{ObjX invcr(c)}
Modelos y Paradigmas de Programación
Recorderis: Abstracción de datos
Principios de la POO
Herencia
Un modelo OO
Clases como abstracciones de datos completas
Clases como abstracciones de datos incrementales
Otros conceptos ligados a la herencia (10)
Delegación - Utilización (5)
class C2b
attr i:0
meth inic skip end
end
ObjX={NewD C2b inic}
{ObjX asgnDelegado(Obj2)}
Juan Francisco Dı́az Frias
Delegación - Utilización (6)
{ObjX asgnDelegado(Obj1)}
{ObjX invcr(c)}
Modelos y Paradigmas de Programación
Descargar