HERENCIA Y POLIMORFISMO HERENCIA Y POLIMORFISMO B Dadas las siguiente declaraciones: D A xa; C xc; B xb; D xd; D En Java, NO son válidas las siguientes asignaciones: xc = xb; xd = xb; xc = xd; xd = xc; HERENCIA Y POLIMORFISMO La ligadura se establece con el método p de la clase B, p está redefinido Sin embargo, si una variable declarada de clase A referencia a un objeto de clase B y recibe un mensaje que corresponde a un método redefinido en B, la ligadura se establece con el método redefinido. La variable determina los mensajes que un objeto puede recibir, pero el objeto determina la implementación específica del comportamiento que se ejecuta en respuesta a los mensajes. HERENCIA Y POLIMORFISMO class A { public boolean q (double x) } class B extends A { public boolean q (String x) Introducción a la Programación Orientada a Objetos class A { public boolean p (int x) {…} } class B extends A { public boolean p (int x) {…} public int r (int x) {…} } A xa; B xb = new B(); xa = xb; xa.p(0); xa = xd; Introducción a la Programación Orientada a Objetos B Introducción a la Programación Orientada a Objetos A Dadas las declaraciones: xb = xa; xc = xa; xd = xa; xa = xc; xb = xd; Los objetos referenciados por variables de la clase A sólo podrán recibir los mensajes que corresponden al comportamiento de la clase A. El chequeo de tipos en compilación establece restricciones sobre las asignaciones polimórficas. C D C HERENCIA Y POLIMORFISMO HERENCIA Y POLIMORFISMO B xb; D xd; B En Java son válidas las siguientes asignaciones polimórficas: xa = xb; xb = xc; A xa; C xc; A {…} {…} } A xa; B xb = new B(); xa = xb; xa.q(0); Introducción a la Programación Orientada a Objetos C En Java, si una variable x se declara de clase A (tipo estático) puede referenciar a objetos de esa clase, pero también a objetos de la clase B, C o D (tipo dinámico). Introducción a la Programación Orientada a Objetos A Una asignación polimórfica asocia una referencia a un objeto de una clase derivada, a una variable declarada de una clase ancestro. Introducción a la Programación Orientada a Objetos Una variable polimórfica puede referenciar a objetos de diferentes clases. La ligadura se establece con el método q de la clase A, q está sobrecargado xa.r(0); NO ES VALIDO, r no está definido en A 1 Redefinición y Sobrecarga Redefinición y Sobrecarga Dada la siguiente jerarquía de clases: Redefinición y Sobrecarga Redefinición y Sobrecarga class Delta extends Beta{ protected int l; protected char ch; public Beta(){ m= 11; ss= new String ("Beta"); } public String p(int x){ return ss +" p "+ m + x; } public String q(String x){ return ss +" q "+ m + x;} Introducción a la Programación Orientada a Objetos class Beta extends Alfa{ protected int m; protected String ss; } public Delta(){ l= 12; ch = 'D'; } public String q(int x){ return ch +" q "+ l + x; } public String t(int x){ return ch +" t "+ l + x; } public String v(char c,int x){ String sss= ch +" v "+ l + x + c; return sss; } } Redefinición y Sobrecarga Redefinición y Sobrecarga class HP{ Los objetos referenciados por variables de una clase sólo podrán recibir los mensajes que corresponden al comportamiento de esa clase. Si una variable declarada de una clase referencia a un objeto de una clase derivada y recibe un mensaje que corresponde a un método sobrecargado en la clase derivada, la ligadura se establece de acuerdo al tipo estático. public static void main (String a[]){ Alfa Alfa Beta Alfa Beta Delta Introducción a la Programación Orientada a Objetos Si una variable declarada de una clase referencia a un objeto de una clase derivada recibe un mensaje que corresponde a un método redefinido en la clase derivada, la ligadura se establece con el método redefinido. Introducción a la Programación Orientada a Objetos Delta public Alfa(){ n= 10; s= new String ("Alfa"); } public String p(int x){ return s + " p " + n + x; } public String q(int x){ return s +" q " + n + x; } public String r(int x){ return s +" r " + n +x; } public String r(String x){ return s + " r " + n + x; }} a1 a2 a3 a4 a5 a6 = = = = = = new new new new new new Alfa(); Beta(); Beta(); Delta(); Delta(); Delta(); … Introducción a la Programación Orientada a Objetos Beta Introducción a la Programación Orientada a Objetos Alfa Introducción a la Programación Orientada a Objetos class Alfa{ protected int n; protected String s; }} tipo estático tipo dinámico 2 public String p(int x){ return ss+" p "+m + x;} 5 5 5 5 public String r(int x){ return s+" r "+n +x;} 7 7 7 7 7 7 en Alfa public String r(String x){ return s+" r "+ n +x;} public String q(int x){ return s+" q "+n +x;} en Alfa public String q(String x){ return ss+" q "+m +x;} en Beta public String q(int x){ return ch+" q "+l +x;} en Delta en Beta en Delta class HP{ public static void main (String a[]){ … System.out.println(a1.r("xyz")); System.out.println(a2.r("xyz")); System.out.println(a3.r("xyz")); System.out.println(a4.r("xyz")); System.out.println(a5.r("xyz")); System.out.println(a6.r("xyz")); Mostrará: Alfa Alfa Alfa Alfa Alfa Alfa r r r r r r 10 10 10 10 10 10 xyz xyz xyz xyz xyz xyz public String r(int x){ en Alfa return s+" r "+n+" x: "+x;} public String r(String x){ return s+" r "+n+" x: "+x;} Redefinición y Sobrecarga Introducción a la Programación Orientada a Objetos Redefinición y Sobrecarga class HP{ public static void main (String a[]){ … Mostrará: System.out.println(a1.q("q8")); ERROR en compilación System.out.println(a2.q("q8")); ERROR en compilación System.out.println(a3.q("q8")); beta Q 11 q8 System.out.println(a4.q("q8")); ERROR en compilación System.out.println(a5.q("q8")); beta Q 11 q8 System.out.println(a6.q("q8")); beta Q 11 q8 en Alfa Redefinición y Sobrecarga Introducción a la Programación Orientada a Objetos Redefinición y Sobrecarga class HP{ public static void main (String a[]){ … Mostrará: System.out.println(a1.r(7)); Alfa r 10 System.out.println(a2.r(7)); Alfa r 10 System.out.println(a3.r(7)); Alfa r 10 System.out.println(a4.r(7)); Alfa r 10 System.out.println(a5.r(7)); Alfa r 10 System.out.println(a6.r(7)); Alfa r 10 public String q(int x){ return s+" q "+n +x;} public String q(String x){ return ss+" q "+m +x;} public String q(int x){ return ch+" q "+l +x;} Introducción a la Programación Orientada a Objetos En Beta: 5 class HP{ public static void main (String a[]){ … Mostrará: System.out.println(a1.q(6)); Alfa q 10 6 System.out.println(a2.q(6)); Alfa q 10 6 System.out.println(a3.q(6)); Alfa q 10 6 System.out.println(a4.q(6)); D q 12 6 System.out.println(a5.q(6)); D q 12 6 System.out.println(a6.q(6)); D q 12 6 class HP{ public static void main (String … System.out.println(a1.t(9)); System.out.println(a2.t(9)); System.out.println(a3.t(9)); System.out.println(a4.t(9)); System.out.println(a5.t(9)); System.out.println(a6.t(9)); public String t(int x){ return ch+" t "+l +x; } a[]){ Mostrará: ERROR en ERROR en ERROR en ERROR en ERROR en D t compilación compilación compilación compilación compilación 12 9 en Delta Introducción a la Programación Orientada a Objetos public String p(int x){ return s+" p “ + n + x;} 5 Introducción a la Programación Orientada a Objetos En Alfa: Redefinición y Sobrecarga Introducción a la Programación Orientada a Objetos Redefinición y Sobrecarga class HP{ public static void main (String a[]){ … Mostrará: System.out.println(a1.p(5)); Alfa p 10 System.out.println(a2.p(5)); Beta p 11 System.out.println(a3.p(5)); Beta p 11 System.out.println(a4.p(5)); Beta p 11 System.out.println(a5.p(5)); Beta p 11 System.out.println(a6.p(5)); Beta p 11 3 Redefinición y Sobrecarga Redefinición y Sobrecarga class HP{ public static void main (String a[]){ … en en en en en en compilación compilación compilación compilación compilación compilación public String v(char c,int x){ String sss= ch+" v "+l +x +c; return sss; } en Delta System.out.println(a1.v("x",7)); System.out.println(a2.v("x",7)); System.out.println(a3.v("x",7)); System.out.println(a4 v("x",7)); System.out.println(a5 v("x",7)); System.out.println(a6 v("x",7)); ERROR ERROR ERROR ERROR ERROR ERROR public String v(char c,int x){ String sss= ch+" v "+l +x +c; return sss; } en en en en en en compilación compilación compilación compilación compilación compilación en Delta Introducción a la Programación Orientada a Objetos ERROR ERROR ERROR ERROR ERROR ERROR Introducción a la Programación Orientada a Objetos System.out.println(a1.v(7)); System.out.println(a2.v(7)); System.out.println(a3.v(7)); System.out.println(a4.v(7)); System.out.println(a5.v(7)); System.out.println(a6.v(7)); class HP{ public static void main (String a[]){ … Redefinición y Sobrecarga class HP{ public static void main (String a[]){ … ERROR ERROR ERROR ERROR ERROR public String v(char c,int x){ String sss= ch+" v "+l +x +c; return sss; } en en en en en D compilación compilación compilación compilación compilación v 12 7 en C Introducción a la Programación Orientada a Objetos Mostrará: System.out.println(a1.v(‘x’,7)); System.out.println(a2.v(‘x’,7)); System.out.println(a3.v(‘x’,7)); System.out.println(a4 v(‘x’,7)); System.out.println(a5 v(‘x’,7)); System.out.println(a6 v(‘x’,7)); 4