Clase 24
Clase 24
Clase 24
3 Ejemplos y Semántica
Objetos y Clases
Objetos y Clases
Objetos y Clases
Herencia
Polimorfismo
Sintaxis
El lenguaje del curso debe ser extendido mediante reglas de
producción que permitan la programación orientada o objetos.
Un programa será ahora, una secuencia de declaraciones de
clases seguida de una expresión:
Sintaxis
Sintaxis
Ejemplos y Semántica
Ejemplos:
Ejemplos y Semántica
Ejemplos
Ejemplos y Semántica
Ejemplos
let t1 = 0
t2 = 0
o1 = new c1(3)
in begin
set t1 = send o1 getstate();
send o1 countup(2);
set t2 = send o1 getstate();
list(t1,t2)
end
Conceptos Fundamentales de la Programación Orientada a Objetos.
Sintaxis de la programación orientada a objetos
Ejemplos y Semántica
Implementación Conceptos Programación Orientada a objetos
Ejemplos y Semántica
Ejemplos
Ejemplos y Semántica
Ejemplos
Ejemplos y Semántica
Ejemplos:
Ejemplos y Semántica
Ejemplos
let
o1 = new interior_node(
new interior_node(new leaf_node(3),
new leaf_node(4)),
new leaf_node(5))
in
send o1 sum()
Ejemplos y Semántica
Ejemplos
Ejemplos y Semántica
Ejemplos:
Un método puede invocar otros métodos del mismo objeto usando
el identificador self, el cual está ligado al objeto en el cual el
método es invocado.
Ejemplos y Semántica
Ejemplos herencia
Ejemplos y Semántica
Ejemplos herencia
class c2 extends c1
field y
method sety2 (v) set y = v
method getx2 () x
method gety2 () y
Conceptos Fundamentales de la Programación Orientada a Objetos.
Sintaxis de la programación orientada a objetos
Ejemplos y Semántica
Implementación Conceptos Programación Orientada a objetos
Ejemplos y Semántica
Ejemplos herencia
let
o2 = new c2()
in
begin
send o2 setx1(101);
send o2 sety1(102);
send o2 sety2(999);
list(send o2 getx1(), % retorna 101
send o2 gety1(), % retorna 102
send o2 getx2(), % retorna 101
send o2 gety2()) % retorna 999
end
Conceptos Fundamentales de la Programación Orientada a Objetos.
Sintaxis de la programación orientada a objetos
Ejemplos y Semántica
Implementación Conceptos Programación Orientada a objetos
Ejemplos y Semántica
Ejemplos herencia
Ejemplos y Semántica
Ejemplos herencia
Ejemplos y Semántica
Ejemplos herencia
Ejemplo:
class c2 extends c1
method initialize () 1
method m2 () 2
Conceptos Fundamentales de la Programación Orientada a Objetos.
Sintaxis de la programación orientada a objetos
Ejemplos y Semántica
Implementación Conceptos Programación Orientada a objetos
Ejemplos y Semántica
Ejemplos herencia
let
o1 = new c1()
o2 = new c2()
in
list(send o1 m1(), % retorna 1
send o1 m2(), % retorna 100
send o1 m3(), % retorna 100
send o2 m1(), % retorna 1 (de c1)
send o2 m2(), % retorna 2 (de c2)
send o2 m3()) % retorna 2 (m3 de c1 llama a m2 de c2)
Conceptos Fundamentales de la Programación Orientada a Objetos.
Sintaxis de la programación orientada a objetos
Ejemplos y Semántica
Implementación Conceptos Programación Orientada a objetos
Ejemplos y Semántica
Ejemplos herencia
Ejemplos y Semántica
Ejemplos:
Un ejemplo de super llamados:
class point extends object
field x
field y
method initialize (initx, inity)
begin
set x = initx;
set y = inity
end
Aspectos Generales
Aspectos Generales
(define eval-program
(lambda (pgm)
(cases program pgm
(a-program (c-decls exp)
(elaborate-class-decls! c-decls)
(eval-expression exp (init-env))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Aspectos Generales
Aspectos Generales
Aspectos Generales
Aspectos Generales
Aspectos Generales
Aspectos Generales
Aspectos Generales
Implementación simple
Implementación simple
Implementación simple
Implementación simple
(define elaborate-class-decls!
(lambda (c-decls)
(set! the-class-env c-decls)))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
(define lookup-class
(lambda (name)
(let loop ((env the-class-env))
(cond
((null? env)
(eopl:error ’lookup-class
"Unknown class ~s" name))
((eqv? (class-decl->class-name (car env)) name)
(car env))
(else (loop (cdr env)))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
Implementación simple
Ejemplo
Ejemplo:
Implementación simple
Ejemplo
class c2 extends c1
field y
method initialize ()
begin
super initialize();
set y = 22
end
method m1 (u, v) ... x ... y ...
method m3 () ...
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
Ejemplo
class c3 extends c2
field x
field z
method initialize ()
begin
super initialize();
set x = 31;
set z = 32
end
method m3 () ... x ... y ... z ...
Implementación simple
Ejemplo
31 32 22 11 12
x z y x y
Implementación simple
Implementación simple
Implementación simple
(define new-object
(lambda (class-name)
(if (eqv? class-name ’object)
’()
(let ((c-decl (lookup-class class-name)))
(cons
(make-first-part c-decl)
(new-object (class-decl->super-name c-decl)))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
(define make-first-part
(lambda (c-decl)
(a-part
(class-decl->class-name c-decl)
(make-vector (length (class-decl->field-ids c-decl))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
Implementación simple
(define find-method-and-apply
(lambda (m-name host-name self args)
(if (eqv? host-name ’object)
(eopl:error ’find-method-and-apply
"No method for name ~s" m-name)
(let ((m-decl (lookup-method-decl m-name
(class-name->method-decls host-name))))
(if (method-decl? m-decl)
(apply-method m-decl host-name self args)
(find-method-and-apply m-name
(class-name->super-name host-name)
self args))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
Implementación simple
La siguiente figura muestra el ambiente para la aplicación del
ejemplo mostrado anteriormente:
env
o3
31 32
x z
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
Implementación simple
Implementación simple
(define build-field-env
(lambda (parts)
(if (null? parts)
(empty-env)
(extend-env-refs
(part->field-ids (car parts))
% (part->fields (car parts))
(build-field-env (cdr parts))))))
(define extend-env-refs
(lambda (syms vec env)
(extended-env-record syms vec env)))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Implementación simple
(define apply-method
(lambda (m-decl host-name self args)
(let ((ids (method-decl->ids m-decl))
(body (method-decl->body m-decl))
(super-name (class-name->super-name host-name)))
(eval-expression body
(extend-env
(cons ’%super (cons ’self ids))
(cons super-name (cons self args))
(build-field-env
(view-object-as self host-name)))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
Objetos Planos
Objetos Planos
class c2 extends c1
field y
method initialize ()
begin
super initialize();
set y = 22
end
method m1 (u, v) ... x ... y ...
method m3 () ...
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
class c3 extends c2
field x
field z
method initialize ()
begin
super initialize();
set x = 31;
set z = 32
end
method m3 () ... x ... y ... z ...
Objetos Planos
Objetos Planos
Objetos Planos
(define rib-find-position
(lambda (name symbols)
(list-find-last-position name symbols)))
(define list-find-last-position
(lambda (sym los)
(let loop
((los los) (curpos 0) (lastpos #f))
(cond
((null? los) lastpos)
((eqv? sym (car los))
(loop (cdr los) (+ curpos 1) curpos))
(else (loop (cdr los) (+ curpos 1) lastpos))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
Objetos Planos
Objetos Planos
(define new-object
(lambda (class-name)
(an-object
class-name
(make-vector (roll-up-field-length class-name)))))
(define roll-up-field-length
(lambda (class-name)
(if (eqv? class-name ’object)
0
(+ (roll-up-field-length
(class-name->super-name class-name))
(length (class-name->field-ids class-name))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
Objetos Planos
(define apply-method
(lambda (m-decl host-name self args)
(let ((ids (method-decl->ids m-decl))
(body (method-decl->body m-decl))
(super-name (class-name->super-name host-name))
(field-ids (roll-up-field-ids host-name))
(fields (object->fields self)))
(eval-expression body
(extend-env
(cons ’%super (cons ’self ids))
(cons super-name (cons self args))
(extend-env-refs field-ids fields (empty-env)))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
Objetos Planos
(define roll-up-field-ids
(lambda (class-name)
(if (eqv? class-name ’object)
’()
(append
(roll-up-field-ids
(class-name->super-name class-name))
(class-name->field-ids class-name)))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
env
(%super self u v) (x y y)
c1 7 8 11 12 22 31 32
x y y x z
an−object c3
binding for y
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
Objetos Planos
Objetos Planos
Objetos Planos
Objetos Planos
Objetos Planos
La siguiente figura muestra las estructuras de clases y métodos
para el ejemplo mostrado anteriormente:
una clase
nombre c1
superclase object
tamaño 2 cuerpo del metodo
identificadores (x y)
( )
metodos
un metodo
declaracion m1 m2
c2
c1
3
(x y y)
( )
m1 m3
c1 c1
(x y y) (x y y)
c3
c2
5
(x y y x z)
( )
m3
c2
(x y y x z)
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
(define elaborate-class-decls!
(lambda (c-decls)
(initialize-class-env!)
(for-each elaborate-class-decl! c-decls)))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
(define elaborate-class-decl!
(lambda (c-decl)
(let ((super-name (class-decl->super-name c-decl)))
(let ((field-ids (append
(class-name->field-ids super-name)
(class-decl->field-ids c-decl))))
(add-to-class-env!
(a-class
(class-decl->class-name c-decl)
super-name
(length field-ids)
field-ids
(roll-up-method-decls
c-decl super-name field-ids)))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
(define roll-up-method-decls
(lambda (c-decl super-name field-ids)
(map
(lambda (m-decl)
(a-method m-decl super-name field-ids))
(class-decl->method-decls c-decl))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
Objetos Planos
(define apply-method
(lambda (method host-name self args)
(let ((ids (method->ids method))
(body (method->body method))
(super-name (method->super-name method))
(field-ids (method->field-ids method))
(fields (object->fields self)))
(eval-expression body
(extend-env
(cons ’%super (cons ’self ids))
(cons super-name (cons self args))
(extend-env-refs field-ids fields (empty-env)))))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Objetos Planos
(define new-object
(lambda (class-name)
(an-object
class-name
(make-vector (class-name->field-length class-name)))))
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Preguntas
?
Conceptos Fundamentales de la Programación Orientada a Objetos.
Aspectos Generales
Sintaxis de la programación orientada a objetos
Una implementación simple
Ejemplos y Semántica
Objetos Planos
Implementación Conceptos Programación Orientada a objetos
Próxima sesión
Objetos y tipos.