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