Konposizioa, herentziaeta polimorfismoa
Aitor [email protected]
Deustuko UnibertsitateaIngeniaritza fakultateahttp://www.deusto.es
2012/02/15
Aurkezpena
1 Zertarako?
2 Konposizioa
3 HerentziaAtributuen herentziaMetodoen herentzia
Aurkezpena
1 Zertarako?
2 Konposizioa
3 Herentzia
Zertarako behar ditugu klaseak zuen ustez?
Zertarako behar ditugu klaseak zuen ustez?
Errealitatea modelatzekoAtributuak: zerMetodoak: nola
Javan ia edozer da objektu batbaina badaude programatzeko beste erak
Aurkezpena
1 Zertarako?
2 Konposizioa
3 Herentzia
Klase baten atributuak
Zer atributu mota eduki ditzake?intboolean...¿?
Pertsona baten atributuak
Ikusgarritasuna
privateBakarrik erabili ahal dugu definituta dagoen klasearenbarnean.
protectedBakarrik erabili ahal dugu klase berberan, ondorengoetanedo pakete bereko klaseetan.
publicEdonondik erabili dezakegu.
Aurkezpena
1 Zertarako?
2 Konposizioa
3 HerentziaAtributuen herentziaMetodoen herentzia
Zertarako behar dugu herentzia?
Kodea berrerabiltzekoez berridazteko eta mantenimendua errezteko.
Klaseak zehazteko edo konplexuagoak egiteko
Herentzia Javan
Klase guztiak dira Object Klasearen “ondorengoak”Klase bakoitza Klase guraso bakarra du
ImplizitoaExplizitoa
Herentzia motak
Deklarazio implizitoa (Objectik)
public class KlasearenIzena {
...
}
Deklarazio explizitoa
public class KlasearenIzena extends GurasoarenIzena {
...
}
Zer heredatzen da?
Atributuen herentzia
Klase baten protected edo public atributuguztiak bere seme-alabek heredatuko dituzte
Ez private!
Seme-alabek gurasoek definitu ez dituztenatributuak definitu ditzaketeSeme-alabek ezin dute gurasoak definitutakoatributuak kendu
Nola heredatu atributuak?
public class Gurasoa {
protected int atrributu1;
protected String atributu2;
...
}
...
public class SemeAlaba extends Gurasoa {
protected int atributu3;
...
}
...
Gurasoa gu = new Gurasoa();
SemeAlaba sa = new SemeAlaba();
sa.atributu1 = 24;
sa.atributu3 = 4;
// ez!!! => gu.atributu3 = 23;
Zer heredatzen da?
Metodoen herentzia
protected edo public diren metodo guztiak klaseseme-alabetan heredatzen dira
private ez!
Klase seme-alabak metodo berriak definitu ditzakeGurasotik heredatutako kodea berdefinitu dezake
Ezin du kendu, baina bai guztiz aldatu
Nola heredatu metodo bat? I
public class Gurasoa {
...
public void metodoa1() {
System.out.println("Gurasoan nago definituta!");
}
...
}
...
public class SemeAlaba extends Gurasoa {
... // ez du metodoa1 definitzen
}
...
SemeAlaba sa = new SemeAlaba();
sa.metodoa1();
Nola heredatu metodo bat? II
public class Gurasoa {
...
public void metodoa1() {
System.out.println("Gurasoan nago definituta!");
}
...
}
...
public class SemeAlaba extends Gurasoa {
...
// birdefinitu
public void metodoa1() {
System.out.println("Semean nago definituta!");
}
}
...
SemeAlaba sa = new SemeAlaba();
sa.metodoa1();
Super
KonstruktoreanLehenengo sententzia klase gurasoaren konstruktorearendeia da
super(param1, param2);
Ez bada idazten, Javak inplizituki parametrorik gabekokonstructoreari deituko dio
super();
Edozein metodoaren barnean, ”super.” erabiliz“this” erabiltzen dugun moduan
super.metodo1(); // aitaren ‘‘metodo1’’ deitzen du
Polimorfismoa
Metodo bat deitzen duen objektuaren motaren arabera eradesberdinean jokatzea ahalbidetzen duen propietatea da.
IrudiGeometrikoa fig = new Zirkulua(3);
// zirkuluaren azalera erakusten du
System.out.println(fig.area());
IrudiGeometrikoa fig = new Errektangelua(5, 7);
// Errektangeluaren azalera erakusten du
System.out.println(fig.area());
Bateragarritasuna
B klasea Aren semea bada, edozei B klasekoa denedozein objektu, A klasekoa izango da baita ere
Gutxienez, B klaseko objektua A klaseko baten atributu etametodo berdinak izango dituBeraz, A klaseko objektuekin egin dezakegun edozeingauza, B klasekoekin ere egin dezakegu
¿Eta alderantziz?A obj1 = (A) obj2; // obj2 B klasekoa izandaKastinga ez du aldatzen objektuaren balioa, bakarrikikusten dugu ”beste ikuspegi batetik”, baina objektu bera daBakarrik egin dezakegu hierarkian zehar, ez ”horizontalki”
Bateragarritasuna
Izen berdina duten zenbait metodo existitu daitekeBaldin eta parametro desberdinak jasotzen baduteKasurik argienak konstruktoreak dira
public void pantailanErakutsi(String izena) {
System.out.println(izena);
}
public void pantailanErakutsi(String izena, String abizena) {
System.out.println(izena+" "+abizena);
}
Abstract
Kontzeptuak modelatzekoKlase abstraktua
Ezin da instantziatu (new KlaseAbs()), baina ondorengoakizan ahal dituEz ditu zertan metodo abstraktuak eduki behar
Metodo abstraktuaImplementaziorik gabe deklaratzen den metodoa da(giltzarik gabe, ondoren puntu eta koma bat jarriz):
abstract void moveTo(double deltaX, double deltaY);
Klase batek metodo abstraktuak baldin baditu, klase horiabstraktua deklaratu beharko da ere.
Galderak: bateragarritasuna (I)
Klase hierarkia hau edukita:Eta honako objektuak baditugu...
A a = new A();
B b = new B();
C c = new C();
D d = new D();
E e = new E();
Posiblea da...
Galderak: bateragarritasuna (II)
A m = b;
A n = c;
B o = d;
B p = c;
B q = (B) e;
A r = (A) d;
D s = (D) a;
B t = (B) n;
C u = (C) e;
C v = (E) e;
C w = (C) a;
C y = (C) n;
C z = (C) m;
B h = (B) m;
Galderak: abstrakzioa
Zein izan daiteke posible?Klase abstraktua
A abstract da, A aldagaia = new A();A ez da abstract, baina b() abstact metodoa duA abstract klasea da eta b() metodoa ez da abstractA abstract da eta b() metodo abstract-a du
B ondorengoa du, eta honek e() eta d() metodoak definitzendituB aldagaia = new B();
Galderak: herentzia
Honako klase hierarkia edukita...A klasea (a eta b metodoak)B klasea (d metodo abstraktua)C (e metodoa duena)
Posiblea da...A a = new A();B b = new C();C c = new C();
a.a();
a.b();
a.d();
a.e();
b.a();
b.b();
b.d();
b.e();
c.a();
c.b();
c.d();
c.e();
Galderak: polimorfismoa (1)
Honako hierarkia duguKlase abstraktua
A klasea
public A() { sysout("konstruktore1"); }
public A(String e) { sysout("konstruktore2"); }
public A(int e) { this(); sysout("konstruktore3"); }
public erakutsi() { sysout("ABC"); }
public erakutsi(String a) { sysout(a); }
B klasea (A-ren ondorengoa dena)
public B() {}
public B(String e) { super(e); }
public B(float e) { super((int) e); };
public erakutsi() { sysout("DEF"); }
public erakutsi(String a) { super.erakutsi(); }
Galderak: polimorfismoa (2)
Zer gertatuko litzateke...
A a = new A();
B b = new B();
A c = new A("eo");
A d = new B("eo");
B e = new B(33f);
B f = new B(33);
A g = new A(33f);
A h = new A(33);
d.erakutsi();
c.erakutsi();
b.erakutsi("aa");
a.erakutsi("eo");
Ordenagailuan frogatu!
Lizentzia
Irudien guztien jabetza intelektuala bere egileena* da,gainontzeko edukiak Creative Commons by-sa 3.0
lizentziapean daude.
* heididorf, jakecaptive, ArtFavor, J. Cameron (public domain), freecat,Marcelo Mathias Lima, owenbooth, mikebaird, ableman eta oberazzi.