Konposizioa, herentzia eta polimorfismoa

Post on 23-Jun-2015

305 views 0 download

description

Programazioa II (2012): 3. gaia

Transcript of Konposizioa, herentzia eta polimorfismoa

Konposizioa, herentziaeta polimorfismoa

Aitor Gomez-Goiriaitor.gomez@deusto.es

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!