Professional Documents
Culture Documents
Conceptes de Programaci o Orientada A Objectes
Conceptes de Programaci o Orientada A Objectes
Projecte de Programació
Conceptes de programació orientada a objectes
Miquel Bofill
http://imae.udg.edu/~mbofill
IMAE – UdG
Resum
Herència vs Subtipatge
Definició (Herència)
El fet que una classe (subclasse) contingui les variables i mètodes
definits en una altra classe (superclasse).
Herència vs Subtipatge
Definició (Herència)
El fet que una classe (subclasse) contingui les variables i mètodes
definits en una altra classe (superclasse).
Definició (Subtipatge)
Forma de polimorfisme en què un determinat tipus de dades
(subtipus) està relacionat amb un altre tipus de dades (supertipus)
per alguna noció de substituı̈bilitat. Tı́picament: si S és subtipus
de T , aleshores qualsevol expressió (objecte) de tipus S pot ser
usat amb seguretat en qualsevol context on s’esperi una expressió
(objecte) de tipus T .
Sobreescriptura i Sobrecàrrega
Definició (Sobreescriptura)
Substitució d’un mètode heretat per un altre amb idèntica
signatura.
Definició (Sobrecàrrega)
Existència dins un mateix àmbit de visibilitat de mètodes amb
mateix nom i
diferent signatura.
Miquel Bofill, IMAE – UdG ProPro – Conceptes de OOP 6 / 22
Herència vs Subtipatge
Sobreescriptura i Sobrecàrrega
Conceptes de programació orientada a objectes Tipus aparent i tipus real
Assignació i lligam missatge-mètode
Utilització vs Refinament
dibuixa(new Punt2D(0.0,3.0));
dibuixa(new Punt3D(2.5,4.3,0.0));
Assignació
Lligam missatge-mètode
Quan fem
objecte.nomMetode(p1,...,pn )
diem que estem enviant un missatge a l’objecte.
Quin mètode executarà l’objecte en rebre el missatge?
Evidentment, un mètode amb el mateix nom que el missatge,
però. . .
Lligam missatge-mètode
Quan fem
objecte.nomMetode(p1,...,pn )
diem que estem enviant un missatge a l’objecte.
Quin mètode executarà l’objecte en rebre el missatge?
Evidentment, un mètode amb el mateix nom que el missatge,
però. . .
I si hi ha sobreescriptura?
Lligam missatge-mètode
Quan fem
objecte.nomMetode(p1,...,pn )
diem que estem enviant un missatge a l’objecte.
Quin mètode executarà l’objecte en rebre el missatge?
Evidentment, un mètode amb el mateix nom que el missatge,
però. . .
I si hi ha sobreescriptura?
I si hi ha sobrecàrrega?
Lligam missatge-mètode
Quan fem
objecte.nomMetode(p1,...,pn )
diem que estem enviant un missatge a l’objecte.
Quin mètode executarà l’objecte en rebre el missatge?
Evidentment, un mètode amb el mateix nom que el missatge,
però. . .
I si hi ha sobreescriptura?
I si hi ha sobrecàrrega?
Per triar el mètode, es tindrà en compte:
El tipus aparent de l’objecte receptor del missatge
. . . o el tipus real de l’objecte receptor del missatge?
El tipus aparent dels paràmetres
. . . o el tipus real dels paràmetres?
En això cada llenguatge de programació és diferent!
Miquel Bofill, IMAE – UdG ProPro – Conceptes de OOP 9 / 22
Herència vs Subtipatge
Sobreescriptura i Sobrecàrrega
Conceptes de programació orientada a objectes Tipus aparent i tipus real
Assignació i lligam missatge-mètode
Utilització vs Refinament
class Llista {
public Llista unio(Llista l) [1]
{ codi per fer la unio de dues llistes }
}
Bé
No tan bé?
COM FUNCIONA
1 En temps de compilació es determina la signatura S del
mètode “més proper” al missatge, considerant el tipus aparent
del receptor i dels paràmetres del missatge.
2 En temps d’execució es busca un mètode amb signatura S,
“pujant en la jerarquia” a partir del tipus real del receptor.
COM FUNCIONA
1 En temps de compilació es determina la signatura S del
mètode “més proper” al missatge, considerant el tipus aparent
del receptor i dels paràmetres del missatge.
2 En temps d’execució es busca un mètode amb signatura S,
“pujant en la jerarquia” a partir del tipus real del receptor.
Tots els compiladors utilitzen tipus aparents en temps de
compilació. Les diferències apareixen en temps d’execució.
Tipus de lligam Usa (temps exec.) Llenguatge
Static binding Tipus aparents C++, C#, . . .
Dynamic binding Tipus real receptor,
amb single dispatching tipus aparent paràm. Java, C++(virtual)
amb multiple dispatch. tipus real paràm. Multijava
Miquel Bofill, IMAE – UdG ProPro – Conceptes de OOP 14 / 22
Herència vs Subtipatge
Sobreescriptura i Sobrecàrrega
Conceptes de programació orientada a objectes Tipus aparent i tipus real
Assignació i lligam missatge-mètode
Utilització vs Refinament
Vol Reserva
Vol Reserva
Gràficament:
Vol v
Vector reserves
...
Codi
public class Vol {
protected Vector reserves = new Vector();
...
public void afegirReserva(Reserva r) {
reserves.addElement(r); }
public void anularReserva(Reserva r) {
reserves.removeElement(r); }
public Iterator reserves() {
return reserves.iterator(); }
}
public class Reserva {
protected Vol vol;
...
public void anotarVol(Vol v) { vol = v; }
public void esborrarVol() { vol = null; }
public Vol vol() { return vol; }
}
Exemple d’utilització
Vol v = new Vol();
Reserva a = new Reserva();
Reserva b = new Reserva();
Reserva c = new Reserva();
v.afegirReserva(a);
a.anotarVol(v);
v.afegirReserva(b);
b.anotarVol(v);
v.afegirReserva(c);
c.anotarVol(v);
Soci Empleat
Soci Empleat
SociEmpleat
Persona
RolPersona
Soci Empleat