Tipos para Lenguajes Orientado a Objetos

Anuncio
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Tipos para Lenguajes Orientado a Objetos
Eduardo Bonelli
Departamento de Computación
FCEyN
UBA
27 de junio, 2006
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Introducción
Todos los lenguajes “modernos” cuentan con sistemas de tipos
Ya hemos discutido los beneficios de contar con sistemas de
tipos
Los lenguajes orientados a objetos también cuentan con
sistemas de tipos
Sin embargo, los sistemas de tipos en lenguajes OO tienen sus
limitaciones pues hacer type checking para lenguajes OO no
es fácil:
“Type checking object-oriented languages is difficult”a
a
Kim Bruce, Foundations of Object Oriented Languages, MIT
Press,2002.
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Introducción
Desde mediados de los 80 en adelante han habido numerosos
esfuerzos por realizar estudios “teóricos” que analizan
sistemas de tipos para distintos modelos de lenguajes
orientados a objetos
A pesar de que en la actualidad se usan lenguajes OO que
cuentan con sistemas de tipos, el interés radica en que:
Los sistemas de tipo históricamente significativos como el de
SIMULA o aquel propuesto por Borning e Ingallsa para
SmallTalk tenı́an problemas significativos
Un programa bien tipado podrı́a, en tiempo de ejecución,
envı́ar un mensaje a un objeto que no cuenta con un método
para responder al mismo, justamente el motivo por el cual el
sistema de tipos fue introducido!
a
A type declaration and inference system for Smalltalk, POPL
1982
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Introducción
Desde mediados de los 80 en adelante han habido numerosos
esfuerzos por realizar estudios “teóricos” que analizan
sistemas de tipos para distintos modelos de lenguajes
orientados a objetos
A pesar de que en la actualidad se usan lenguajes OO que
cuentan con sistemas de tipos, el interés radica en que:
Hay muchos usuarios de lenguajes OO que consideran que los
sistemas de tipos actuales imponen restricciones demasiado
severas para permitir programación OO verdadera
Vamos a ver algunos ejemplos en la clase de hoy
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Plan de la clase de hoy
Tipos en lenguajes OO
Subtipado y herencia
Sistemas de tipos invariantes
Ilustrar a través de ejemplos algunas limitaciones de sistemas
de tipos invariantes
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Tipos para lenguajes OO
La noción de clase y de tipo se mantienen separadas
La clase es una noción inherentemente de implementación:
establece, entre otras cosas, variables de instancia privadas,
código fuente de los métodos, etc.
El tipo de un objeto representa solamente la interfase pública
del mismo
nombres de todos los métodos
tipo de los argumentos de cada método y tipo del resultado
De esta manera, la especificación de un objeto (representado
por su su tipo) no se mezcla con su implementación
(especificado en su clase)
Esta separación beneficia el desarrollo modular de sistemas:
varias clases pueden instanciar objetos con el mismo tipo
El tipo de un objeto a veces se conoce como interface type
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Ejemplo - Tipo
Por ejemplo, consideremos la clase Point
class Point extends Object
field Int xVal,yVal
method Int x() xVal
method Int y() yVal
method Int distance(otro:Point) ...
Un objeto instancia de la clase Point tendrı́a el siguiente tipo
type Point is
x: () -> Int;
y: () -> Int;
distance: Point -> Int;
end;
OBS: x,y y distance son las componentes del tipo
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Tipos a partir de clases
Como lo muestra el ejemplo podemos extraer de manera
mecánica la información necesaria para construir los tipos de
objetos a través de las declaraciones de clases
Notación: Si C es una clase usaremos CType para hacer
referencia al tipo de los objetos extraı́dos de esa clase
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Subtipado
Recordar que polimorfismo de subtipo significa que en todo
contexto donde se espere un objeto de clase C puede
insertarse cualquier subclase de C
Dado que ahora los objetos (que son instancias de clases)
tienen tipos, uno de los aspectos fundamentales del estudio de
sistemas de tipos para lenguajes OO es una relación de
subtipos
Para indicar que el tipo A es un subtipo del tipo B escribimos
A<:B
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Subtipado de objetos
La relación de subtipos para tipos de objetos se define de
manera estructural
Subtipado de tipos objetos
Sea CType y DType dos tipos de objetos. Decimos que
CType<:DType
si CType tiene todos los componentes de DType y posiblemente
más
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Subtipado de objetos
Dada la siguiente jeraquı́a de clases
class Point extends Object
field Int xVal,yval
method Int x() xVal
method Int y() yVal
class ColorPoint extends Point
field Int color
method Int c() color
vemos que ColorPointType<:PointType donde
type PointType is
x: () -> Int;
y: () -> Int;
end;
type ColorPointType is
x: () -> Int;
y: () -> Int;
c: () -> Int;
end;
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Subtipado
Sustitutividad
Principio básico asociado a noción de subtipo. Establece que si A
es subtipo de B, entonces cualquier expresión de tipo A puede
usarse sin generar error de tipos en cualquier contexto que requiera
una expresión de tipo B
El principio de sustitutividad se refleja en la teorı́a a través de
la regla de subsumption
ΓBM :A
A<:B
(Subsumption)
ΓBM :B
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Herencia y subtipado
Una de las ventajas de la noción de subtipo es la de modelizar
la herencia o subclassing
Por ejemplo, en Java, si la clase A hereda de la clase B,
entonces AType<:BType. Por lo tanto, siempre que sea
requerida una instancia de BType podemos apelar a
subsumption y utilizar una instancia de AType en su lugar.
Para que esto tenga sentido, debe restringirse la noción de
herencia
Si se permitieran redefinir métodos son tipos arbitrarios ya no
podrı́a garantizarse la sustitutividad: por ello se introduce la
noción de sistemas de tipos invariantes
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Sistemas de tipos invariantes
Sistemas de tipos invariantes
Son aquellos sistemas de tipos que restringen la redefinición de
métodos de las subclases y variables de instancia del siguiente
modo:
el método redefinido tiene que tener exactamente el mismo
tipo que el método original de la superclase
el tipo de las variables de instancia no puede cambiarse en la
subclase
Ejemplos de lenguajes cuyo sistema de tipos es invariante son:
C++, Java1 , Object Pascal, Modula-3
1
Java 1.5. permite excepciones
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Herencia y subtipado
La condición de sistema de tipos invariantes permite
capturar la herencia a través del subtipado
herencia ⇒ subtipado
Se busca que la implicación sea estricta de modo de poder
tener más libertad para usar subsumption (sin que provengan
necesariamente de herencia)
Si identificáramos clases con tipos de los objetos tendrı́amos
una situación más restrictiva:
herencia ⇔ subtipado
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Herencia y subtipado
Como dijimos, la separación entre clases y tipos permite que
en sistemas de tipos invariantes se identifiquen situaciones en
que CType <: DType, sin que C sea subclase de D
Si bien esto es deseable, en ocasiones la relación de subtipos
puede ser demasiado liberal; un ejemplo de ello es el
subtipado covariante de arreglos en Java
Si A<:B Java permite sustituir arreglos con componentes de
tipo A por uno con componentes de tipo B
Esto no es correcto desde el punto de vista de tipado
(lectura:ok, escritura:no)...
Requiere un chequeo de run-time en cada asignación
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Introducción
Tipos para lenguajes OO
Subtipado y herencia
Tipado covariante de arreglos en Java
¡El siguiente código pasa el chequeo de tipos pero genera un
error de run-time!
Exception in thread "main" java.lang.ArrayStoreException:
prueba.A
at prueba.Main.main(arreglo.java:11)
package prueba;
import java.io.*;
class A { int j; };
class B extends A { int i; };
class Main {
public static void main(String argv[]) throws IOException{
B[] b = new B[5];
A[] a = b;
a[1] = new A();
}};
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Limitaciones de sistemas invariantes
Los sistemas de tipos invariantes tienen muchas limitaciones:
a veces es necesario cambiar el tipo de retorno de un método
en una subclase
a veces es necesario cambiar el tipo del argumento de un
método en una subclase
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 1 - clonación
En muchos lenguajes OO se dispone de una operación que
permite hacer una copia o clon de un objeto
Especialmente en lenguajes en los que todos los objetos se
representan como referencias y la operación de asignación no
hace más que copiar referencias
Hay dos maneras de clonar un objeto: Shallow y Deep
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 1 - clonación
Shallow: copiar los valores de las variables de instancia y
tomar el mismo conjunto de métodos que el original
Si las variables de instancia tiene referencias a otros objetos
sólo las referencias se copian (y no los objetos referenciados)
Forma tı́pica de proveer esta operación: dar un método
primitivo clone en la clase Object
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 1 - clonación
¿Cuál es el tipo de clone?
En la clase Object debe retornar un valor de tipo ObjectType
Si Cell es una subclase de Object, uno querrı́a que el método
clone heredado por Cell sea CellType
¡En sistemas de tipos invariantes, clone debe tener tipo
Object, aún si el método retorna un valor de tipo CellType!
El programador se verá forzado a hacer un type cast para
permitir al sistema tratar el valor como si tuviera el tipo
deberı́a tener
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 1 - clonación
Si m es un método de la clase Cell y o es una variable de tipo
CellType, la expresión
send (send o clone()) m()
genera un error de tipos
El programador debe insertar un type cast:
send [CellType](send o clone()) m()
funciona bien
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 1 - clonación
Los type casts son una manera explı́cita de indicar subtipos;
hay dos tipos de type cast
“up cast”: [CType]e donde e tiene tipo DType y D es una
subclase de C
“down cast”: [DType]e donde e tiene tipo CType y D es una
subclase de C
El up cast casi no se usa, mientras que el down cast se usa
mucho (para permitir recuperar el tipo “real” de un objeto)
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
Deep clone: Igual que shallow clone salvo que los objetos
referenciados en las variables de instancia se clonan,
recursivamente
Vamos a presentar un ejemplo de las limitaciones de sistemas
de tipos invariantes usando deep clone
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
class C extends object
...
method CType deepClone()
begin
send self clone();
...
end
class SC extends C
field newVar : newObjType:= nil;
method Void newMeth() ...
method Void setNewVar(x:newObjType) set newVar = x
method SCType deepClone()
Problema: deepClone en SC debe retornar algo de tipo CType
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
class C extends object
...
method CType deepClone()
begin
send self clone();
...
end
class SC extends C
field newVar : newObjType:= nil;
method Void newMeth() ...
method Void setNewVar(x:newObjType) set newVar = x
method SCType deepClone()
¡Si unSC es una variable de tipo SCType, send (send unSC
deepClone()) newMeth() genera un error de tipos! Se precisarı́a
un type cast para informar al sistema de tipos
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
class C extends object
...
method CType deepClone()
begin
send self clone();
...
end
class SC extends C
field newVar : newObjType:= nil;
method Void newMeth() ...
method Void setNewVar(x:newObjType) set newVar = x
method SCType deepClone()
Cambiar el nombre del método por algo como SCdeepClone no
soluciona nada pues al enviar el mensaje deepClone a un objeto de
tipo SCType se llamarı́a al deepClone de C...
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
class C extends object
...
method CType deepClone()
begin
send self clone();
...
end
class SC extends C
field newVar : newObjType:= nil;
method Void newMeth() ...
method Void setNewVar(x:newObjType) set newVar = x
method SCType deepClone()
En versiones nuevas de C++ y Java se permite especializar el tipo
de retorno de métodos en subclases.
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
class C extends object
...
class SC extends C
field newVar : newObjType:= nil;
method Void newMeth() ...
method Void setNewVar(x:newObjType) set newVar = x
method SCType deepClone()
let newClone : SCType:=nil
in begin
set newClone = super deepClone();
send newClone setNewVar(send newVar deepClone());
newClone
end
Asumimos que newObjType soporta el método deepClone
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo 2 - clonación deep
class C extends object
...
class SC extends C
field newVar : newObjType:= nil;
method Void newMeth() ...
method Void setNewVar(x:newObjType) set newVar = x
method SCType deepClone()
let newClone : SCType:=nil
in begin
set newClone = super deepClone();
send newClone setNewVar(send newVar deepClone());
newClone
end
Notar que el tipo de super deepClone() es CType (en lugar de
SCType). Por lo tanto, la asignación es incorrecta.
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Métodos binarios
Métodos que tienen un parámetro con la intención de que su
tipo sea igual al del objeto receptor del mensaje
Ejemplos tı́picos son métodos que permiten comparar por
igualdad, menor igual, etc.
En un lenguaje procedural estos métodos se escriben como
funciones que toman dos argumentos (de allı́ el nombre
“binarios”)
En lenguajes OO se escriben como métodos unarios pues el
receptor del mensaje es uno de los parámetros
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo
class C extends Object
...
method Bool equals(otro:CType) ...
class SC extends C
...
method Bool equals(otro:CType)
begin
if super equals(otro) then ... else ...
end
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo
class C extends Object
...
method Bool equals(otro:CType) ...
class SC extends C
...
method Bool equals(otro:CType)
begin
if super equals(otro) then ... else ...
end
Nos gustarı́a que CType fuese SCType pero no está permitido.
Aún si lo estuviera, otros problemas podrı́an surgir
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo
class Point extends Object
field Int xVal,yval
method Int x() xVal
method Int y() yVal
method Bool equal(otro:Point)
(xVal==send otro x) and (yVal==send otro y)
class ColorPoint extends Point
field Int color
method Int c() color
method Bool equal(otro:ColorPoint)
(xVal==send otro x) and (yVal==send otro y)
and (color=send otro c)
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo
class Point extends Object
let breakit=
field Int xVal,yval
Void proc(p:Point)
method Int x() xVal
let pt:Point = new Point(3,4)
method Int y() yVal
in if p.equal(pt) then...
method Bool equal(otro:Point) in e
(xVal==send otro x) and (yVal==send otro y)
class ColorPoint extends Point
field Int color
method Int c() color
method Bool equal(otro:ColorPoint)
(xVal==send otro x) and (yVal==send otro y)
and (color=send otro c)
Si breakit se aplica a un argumento de tipo Point en e, no hay
problemas
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo
class Point extends Object
let breakit=
field Int xVal,yval
Void proc(p:Point)
method Int x() xVal
let pt:Point = new Point(3,4)
method Int y() yVal
in if p.equal(pt) then...
method Bool equal(otro:Point) in e
(xVal==send otro x) and (yVal==send otro y)
class ColorPoint extends Point
field Int color
method Int c() color
method Bool equal(otro:ColorPoint)
(xVal==send otro x) and (yVal==send otro y)
and (color=send otro c)
¡Si breakit se aplica a un argumento de tipo ColorPoint en e,
se produce un error de run-time (aún si el programa tipa correctamente)!
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Otro ejemplo basado en el binary method problem
En el pizarrón:
Listas encadenadas
Extensión a listas doblemente encadenadas
Problema con el tipo del parámetro de setNext
Extensión a listas doblemente encadenadas“legal”
Necesidad de introducción de casting en el cuerpo del método
setNext que puede fallar en run-time
Si dn tiene tipo LglDblNodeType, send (send dn getNext())
getPrev() genera un error de tipos
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Otros problemas
En los ejemplos vistos hasta ahora, el problema surgı́a por la
necesidad de modificar los tipos de retorno o de parámetros al
del objeto que se está definiendo
También hay ejemplos en los que se precisa cambiar el tipo de
retorno o de parámetros de métodos en subclases, con tipos
que no tienen relación alguna con el tipo de los objetos que
define la clase en cuestión
A modo de ejemplo consideremos una clase Circle con un
método getCenter que devuelve un Point
Si definimos una subclase ColorCircle serı́a razonable que
getCenter que devuelva un ColorPoint
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Ejemplo
class Circle extends object
field PointType center:=nil
method PointType getCenter() center
class ColorCircle extends Circle
field colorType color:=black
method ColorPointType getCenter()
En sistemas de tipos invariantes esto no se permite
Aún si se permitiera, no podemos cambiar el tipo del campo
center. Por lo que en el cuerpo de getCenter habrá que
utilizar un type cast o crear un nuevo ColorPoint usando
center y color
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Continuando con el ejemplo
Otro problema surge si disponemos de un método setCenter
en la clase Circle
El método setCenter de la subclase (ie. ColorCircle) debe
tomar como argumento un ColorPoint
Pero esto no es posible en un sistema de tipos invariante
Por lo tanto, tendremos que chequear en run-time si el Point
es un ColorPoint o no antes de hacer la asignación
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Debilitando la condición de invariante
Hemos visto ejemplos que muestran que los sistemas de tipos
invariantes pueden ser restrictivos en ocasiones
Una forma más permisiva de method override es method
specialization: en la redefinición de métodos en la subclase el
tipo del método puede tener
tipo de argumentos más generales
tipo de resultado más especı́fico
Igual esto no soluciona todos los inconvenientes. Por ejemplo
el tipo del método equal
es Point → Bool en la clase Point
es ColorPoint → Bool en la clase ColorPoint
pero ColorPoint no es más general que Point (todo lo
contrario, es más especı́fico pues ColorPoint<:Point)
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Binary Method Problem
Este problema se conoce como el binary method problem (ver
On binary methods, Kim B. Bruce, Luca Cardelli, Giuseppe
Castagna, The Hopkins Objects Group, Gary T. Leavens, and Benjamin Pierce.
Theory and Practice of Object Systems, 1(1995))
Ilustra la diferencia existente entre subclassing y subtyping:
“subclasses do not always generate subtypes”
Técnicamente, el subtipado de funciones es contravariante en
el primer argumento
B<:A
C<:D
A->C <:
B->D
La noción de subtipado de funciones que se requiere para que
ColorPoint sea subtipo de Point no cumple con esta regla
(ie. subtipado covariante no es sound para tipos de objetos)
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Tipos en lenguajes OO
Limitaciones de sistemas invariantes
Necesidad de cambiar el tipo de retorno en subclases
Problemas con métodos binarios
Otros problemas
Conclusión
Los sistemas de tipos para lenguajes OO son un tema de
activa investigación en la actualidad
Los lenguajes OO presentan problemas interesantes para la
comunidad que estudia tipos de datos en lenguajes de
programación
Eventos de relevancia:
OOPSLA (Object-oriented programming, systems, languages
and applications)
International Workshops on Foundations of Object-Oriented
Languages (FOOL)
Workshop on Object-Oriented Developments (WOOD)
Eduardo Bonelli
Tipos para Lenguajes Orientado a Objetos
Descargar