Programación III Herencia 1 Programación III I.T.Informática de Sistemas Introducción a la herencia. Prof. Félix Prieto Arambillet Departamento de Informática Universidad de Valladolid Curso 2003/2004
Programación III Herencia 2 Una clase ancestro class POLIGONO create... feature Acceso contador: INTEGER Número de vértices perimetro: DOUBLE is Perímetro del polígono do... muestra is Muestra el polígono por pantalla do... feature Modificación rota (centro:punto; angulo: DOUBLE) is Rota el polígono en torno al centro do... traslada (a,b:double) is Traslada el polígono a en la do... feature {NONE} Implementación vertices: LINKED_LIST[POINT] Puntos que definen el polígono. invariant contador_coherente: contador = vertices.count al_menos_tres_vertices: contador >= 3 Class POLIGONO
Programación III Herencia 3 Una clase ancestro class RECTANGULO inherit POLIGONO redefine perimetro create make feature Creación make(centro:punto; s1,s2,angulo: DOUBLE) is Crea rectángulo con centro, lados y ángulo de rotación respecto a la horizontal do... feature lado1, lado2 : DOUBLE diagonal : DOUBLE Longitudes de lados y diagonal perimetro: DOUBLE is do Result:= lado1 2 + lado2 2 invariant cuatro_lados: contador = 4 primer_lado: lado1= (vertices@1).distancia(vertices@2) segundo_lado: lado2= (vertices@2).distancia(vertices@3) tercer_lado: lado1= (vertices@3).distancia(vertices@4) cuarto_lado: lado2= (vertices@4).distancia(vertices@1) Class RECTANGULO
Programación III Herencia 4 Definición 1 Llamaremos clase desciente de C a: La propia clase C Recursivamente cualquier heredera de una desciente de C Definición 2 Diremos que B es desciente propio de C si es desciente de ella y ambas son distintas. Definición 3 Llamaremos antecesor o ancestro de C a cualquier clase de la que C sea desciente. Regla 1 Un método que tiene la condición de método de creación en un ancestro no mantiene su condición especial en los descientes.
Programación III Herencia 5 Jerarquía de herencia de las guras FIGURA FIGURA_ABIERTA FIGURA_CERRADA perimetro() SEGMENTO POLILINEA POLIGONO ELIPSE perimetro() perimetro() CUADRANGULO RECTANGULO perimetro() lado1() lado2() TRIANGULO CIRCUNFERENCIA perimetro() CUADRADO perimetro()
Programación III Herencia 6 Jerarquía de herencia de SmallEiffel (simplicada) GENERAL PLATFORM ANY NONE
Programación III Herencia 7 El concepto de polimorsmo Definición 4 Si polimorfismo es la habilidad de tener varias formas, para nosotros polimorfismo va a ser la habilidad de las referencias para estar conectadas a objetos de tipos distintos en tiempo de ejecución, aunque siempre con las restricciones que se deducen de la herencia.
Programación III Herencia 8 Límites del polimorsmo Regla 2 En una llamada x.f donde el tipo de x está basado en una clase C debe ocurrir que f sea característica de uno de los ancestros de C Definición 5 Un tipo U es conforme a un tipo T si y solo si la clase base de U es desciente de la clase base de T y, en el caso de tipos genéricos formalmente derivados cada parámetro actual de U es conforme a cada parámetro actual de T. Regla 3 Una conexión de fuente x y objetivo y es válida si el tipo de x es conforme con el tipo de y.
Programación III Herencia 9 Nueva visión de la instancia Definición 6 Una instancia directa de una clase es un objeto en tiempo de ejecución conseguido mediante una clausula de creación create x donde x es de tipo C, o mediante la clonación de una instancia directa de C Definición 7 Una instancia de C es una instancia directa de un desciente de C. Regla 4 Una entidad declarada de tipo T sólo puede ser conectada en tiempo de ejecución a instancias de T.
Programación III Herencia 10 Tipo estático y dinámico El nivel de las entidades, identicadores en el texto de una clase, que tienen tipo estático y dinámico. El primero es jo y el segundo varía en tiempo de ejecución. El nivel de las referencias en tiempo de ejecución, que están conectadas a un objeto y por ello tienen el tipo dinámico del objeto a. Este tipo dinámico también es variable. El nivel de los objetos que están al nal de las referencias, que sólo tienen tipo dinámico, pero un tipo dinámico que no puede cambiar, es el tipo con que fueron creados. a o NONE si la referencia es vacía
Programación III Herencia 11 Herencia y creación local x: T do... create {U} x... en lugar de local temp: U x: T do... create temp.make x:=temp...
Programación III Herencia 12 class VECTOR[G] inherit ARRAY[G] create make feature {ANY} infix "+" (otro: like current): like current is Suma incorrecta de vectores. require lower = otro.lower upper = otro.upper local i:integer do create Result.make(lower,upper) from i:=lower until i> upper loop Result.put(item(i)+otro.item(i),i);i:=i+1... class VECTOR[G]
Programación III Herencia 13 Transformación general sobre guras transformacion is Modifica la figura de cierta forma. do f.rota(...) f.traslada(...) transformacion es incorrecta porque FIGURA no dispone de los métodos rota y traslada, aunque todos sus herederos pudieran poseerlas.
Programación III Herencia 14 Denición de rota incorporable a gura. rota (centro: PUNTO; angulo: DOUBLE) is Rotación de centro y ángulo dados. deferred Es más razonable aplazar la denición que dejarla hueca
Programación III Herencia 15 Sintaxis de la redeclaración Tipos de redeclaración a diferida a efectiva de diferida redenición concreción redefine ninguna de efectiva indenición redenición undefine redefine
Programación III Herencia 16 Clases y tipos diferidos Definición 8 Diremos que una clase es diferida si alguna de sus características lo es, en caso contrario diremos que la clase es efectiva. Definición 9 Diremos que un tipo es diferido si está basado en una clase diferida. Regla 5 El tipo de una instrucción de creación no puede ser diferido.
Programación III Herencia 17 Especicación pre-post y herencia f is C «call» A f require α... ensure β «call» A f f is require γ... ensure δ
Programación III Herencia 18 La jerarquía de los esquiadores ESQUIADOR compañero comparte_con CHICO compañero comparte_con CHICA compañero comparte_con CHICO_CLASIFICADO compañero comparte_con CHICA_CLASIFICADA compañero comparte_con
Programación III Herencia 19 Fallos en el chequeo de tipos class ESQUIADOR feature compannero: ESQUIADOR Su compañero de habitación. comparte_con(otro:esquiador) is Fija el compañero del esquiador require otro /= Void do compannero := otro Otras características que no nos interesan para el ejemplo class ESQUIADOR
Programación III Herencia 20 Fallos en el chequeo de tipos (ii) class CHICA inherit ESQUIADOR redefine compannero, comparte_con feature compannero: CHICA de habitación. comparte_con(otro:chica) is Fija el compañero require otro /= Void do compannero := otro Para distinguirla bien distinto:real Otras características class CHICA
Programación III Herencia 21 Fallos en el chequeo de tipos (iii) class CHICO inherit ESQUIADOR redefine compannero, comparte_con feature compannero: CHICO de habitación. comparte_con(otro:chico) is Fija el compañero require otro /= Void do compannero := otro Para distinguirlo bien distinto: INTEGER Otras características class CHICO
Programación III Herencia 22 La aplicación que maniesta el fallo class APLICACION Ejemplo de los problemas de la covarianza create make feature make is local s: ESQUIADOR; b: CHICO; g: CHICA do create b ; create g s:= b s.comparte_con(g) Provocamos un error std_output.put_integer( b.compannero.distinto) class APLICACION
Programación III Herencia 23 Segunda versión de los esquiadores class ESQUIADOR feature compannero: like Current Su compañero de habitación. comparte_con(otro:like Current) is Fija el compañero del esquiador require otro /= Void do compannero := otro Otras características que no nos interesan para el ejemplo class ESQUIADOR
Programación III Herencia 24 Segunda versión de los esquiadores (ii) class CHICO inherit ESQUIADOR feature distinto: INTEGER... class CHICO class CHICA inherit ESQUIADOR feature distinto: REAL... class CHICA
Programación III Herencia 25 La aplicación que maniesta el error class APLICACION create make feature make is do Creo esquiadores create b ; create g_actual s:= g_actual; g:=s s:=b s.comparte_con(g) std_output.put_integer( b.compannero.distinto) Esquiadores como atributos para permitir la definición de g like s s: ESQUIADOR; b: CHICO g_actual: CHICA g: like s class APLICACION
Programación III Herencia 26 Más esquiadores con problemas class ESQUIADOR feature compannero: ESQUIADOR Su compañero de habitación. comparte_con(otro:esquiador) is Fija el compañero del esquiador require otro /= Void do compannero := otro Otras características que no nos interesan para el ejemplo class ESQUIADOR
Programación III Herencia 27 Más esquiadores con problemas (ii) class CHICA inherit ESQUIADOR redefine compannero,comparte_con feature compannero: CHICA Su compañero de habitación. comparte_con(otro:chica) is Fija el compañero require otro /= Void do compannero := otro para distinguirla distinto:real class CHICA
Programación III Herencia 28 Más esquiadores con problemas (iii) class ESQUIADOR class CHICA_CLASIFICADA inherit CHICA export {NONE} comparte_con feature Otras características que no nos interesan para el ejemplo invariant compannero = Void class CHICA_CLASIFICADA
Programación III Herencia 29 Otra aplicación que maniesta errores class ESQUIADOR class APLICACION create make feature make is local s: CHICA; g1, g2: CHICA_CLASIFICADA do create g1; create g2 s:= g1 s.comparte_con(g2) std_output.put_real(g1.compannero.distinto) class APLICACION