Presentación de PowerPoint

Anuncio
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
Descargar