SlideShare a Scribd company logo
1 of 36
Download to read offline
Konposizioa, herentzia
  eta polimorfismoa
                ´
         Aitor Gomez-Goiri
      aitor.gomez@deusto.es

         Deustuko Unibertsitatea
          Ingeniaritza fakultatea
         http://www.deusto.es


             2012/02/15
Aurkezpena



  1   Zertarako?


  2   Konposizioa


  3   Herentzia
        Atributuen herentzia
        Metodoen herentzia
Aurkezpena



  1   Zertarako?

  2   Konposizioa

  3   Herentzia
Zertarako behar ditugu klaseak zuen ustez?
Zertarako behar ditugu klaseak zuen ustez?




     Errealitatea modelatzeko
         Atributuak: zer
         Metodoak: nola
     Javan ia edozer da objektu bat
         baina badaude programatzeko beste erak
Aurkezpena



  1   Zertarako?

  2   Konposizioa

  3   Herentzia
Klase baten atributuak




     Zer atributu mota eduki ditzake?
         int
         boolean
         ...
         ¿?
Pertsona baten atributuak
Ikusgarritasuna



     private
         Bakarrik erabili ahal dugu definituta dagoen klasearen
         barnean.
     protected
         Bakarrik erabili ahal dugu klase berberan, ondorengoetan
         edo pakete bereko klaseetan.
     public
         Edonondik erabili dezakegu.
Aurkezpena



  1   Zertarako?

  2   Konposizioa

  3   Herentzia
        Atributuen herentzia
        Metodoen herentzia
Zertarako behar dugu herentzia?


     Kodea berrerabiltzeko
         ez berridazteko eta mantenimendua errezteko.
     Klaseak zehazteko edo konplexuagoak egiteko
Herentzia Javan




     Klase guztiak dira Object Klasearen “ondorengoak”
     Klase bakoitza Klase guraso bakarra du
         Implizitoa
         Explizitoa
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 atributu
    guztiak bere seme-alabek heredatuko dituzte
        Ez private!
    Seme-alabek gurasoek definitu ez dituzten
    atributuak definitu ditzakete
    Seme-alabek ezin dute gurasoak definitutako
    atributuak 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 klase
     seme-alabetan heredatzen dira
         private ez!
     Klase seme-alabak metodo berriak definitu ditzake
     Gurasotik 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


        Konstruktorean
            Lehenengo sententzia klase gurasoaren konstruktorearen
            deia da
              super(param1, param2);
            Ez bada idazten, Javak inplizituki parametrorik gabeko
            konstructoreari 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 era
     desberdinean 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 den
     edozein objektu, A klasekoa izango da baita ere
         Gutxienez, B klaseko objektua A klaseko baten atributu eta
         metodo berdinak izango ditu
         Beraz, A klaseko objektuekin egin dezakegun edozein
         gauza, B klasekoekin ere egin dezakegu
     ¿Eta alderantziz?
         A obj1 = (A) obj2; // obj2 B klasekoa izanda
         Kastinga ez du aldatzen objektuaren balioa, bakarrik
         ikusten dugu ”beste ikuspegi batetik”, baina objektu bera da
         Bakarrik egin dezakegu hierarkian zehar, ez ”horizontalki”
Bateragarritasuna


      Izen berdina duten zenbait metodo existitu daiteke
           Baldin eta parametro desberdinak jasotzen badute
           Kasurik 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 modelatzeko
     Klase abstraktua
           Ezin da instantziatu (new KlaseAbs()), baina ondorengoak
           izan ahal ditu
           Ez ditu zertan metodo abstraktuak eduki behar
     Metodo abstraktua
           Implementaziorik 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 hori
           abstraktua 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 du
         A abstract klasea da eta b() metodoa ez da abstract
         A abstract da eta b() metodo abstract-a du
              B ondorengoa du, eta honek e() eta d() metodoak definitzen
              ditu
              B aldagaia = new B();
Galderak: herentzia


                                        a.a();
                                        a.b();
   Honako klase hierarkia edukita...    a.d();
       A klasea (a eta b metodoak)      a.e();
       B klasea (d metodo abstraktua)   b.a();
       C (e metodoa duena)              b.b();
   Posiblea da...                       b.d();
       A a = new A();                   b.e();
       B b = new C();                   c.a();
       C c = new C();                   c.b();
                                        c.d();
                                        c.e();
Galderak: polimorfismoa (1)

     Honako hierarkia dugu
     Klase 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.

More Related Content

More from Open University, KMi

More from Open University, KMi (8)

Egitura linealak
Egitura linealakEgitura linealak
Egitura linealak
 
Fitxategiak
FitxategiakFitxategiak
Fitxategiak
 
2D arraya eta objetu arrayak
2D arraya eta objetu arrayak2D arraya eta objetu arrayak
2D arraya eta objetu arrayak
 
"On the complementarity of Triple Spaces and the Web of Things" poster @ WoT2011
"On the complementarity of Triple Spaces and the Web of Things" poster @ WoT2011"On the complementarity of Triple Spaces and the Web of Things" poster @ WoT2011
"On the complementarity of Triple Spaces and the Web of Things" poster @ WoT2011
 
A Triple Space-Based Semantic Distributed Middleware for Internet of Things
A Triple Space-Based Semantic Distributed Middleware for Internet of ThingsA Triple Space-Based Semantic Distributed Middleware for Internet of Things
A Triple Space-Based Semantic Distributed Middleware for Internet of Things
 
Presentacion Defensa
Presentacion DefensaPresentacion Defensa
Presentacion Defensa
 
Introducción a PHP5
Introducción a PHP5Introducción a PHP5
Introducción a PHP5
 
Introducción a PHP5
Introducción a PHP5Introducción a PHP5
Introducción a PHP5
 

Konposizioa, herentzia eta polimorfismoa

  • 1. Konposizioa, herentzia eta polimorfismoa ´ Aitor Gomez-Goiri aitor.gomez@deusto.es Deustuko Unibertsitatea Ingeniaritza fakultatea http://www.deusto.es 2012/02/15
  • 2. Aurkezpena 1 Zertarako? 2 Konposizioa 3 Herentzia Atributuen herentzia Metodoen herentzia
  • 3. Aurkezpena 1 Zertarako? 2 Konposizioa 3 Herentzia
  • 4. Zertarako behar ditugu klaseak zuen ustez?
  • 5. Zertarako behar ditugu klaseak zuen ustez? Errealitatea modelatzeko Atributuak: zer Metodoak: nola Javan ia edozer da objektu bat baina badaude programatzeko beste erak
  • 6. Aurkezpena 1 Zertarako? 2 Konposizioa 3 Herentzia
  • 7. Klase baten atributuak Zer atributu mota eduki ditzake? int boolean ... ¿?
  • 9. Ikusgarritasuna private Bakarrik erabili ahal dugu definituta dagoen klasearen barnean. protected Bakarrik erabili ahal dugu klase berberan, ondorengoetan edo pakete bereko klaseetan. public Edonondik erabili dezakegu.
  • 10. Aurkezpena 1 Zertarako? 2 Konposizioa 3 Herentzia Atributuen herentzia Metodoen herentzia
  • 11.
  • 12. Zertarako behar dugu herentzia? Kodea berrerabiltzeko ez berridazteko eta mantenimendua errezteko. Klaseak zehazteko edo konplexuagoak egiteko
  • 13. Herentzia Javan Klase guztiak dira Object Klasearen “ondorengoak” Klase bakoitza Klase guraso bakarra du Implizitoa Explizitoa
  • 14. Herentzia motak Deklarazio implizitoa (Objectik) public class KlasearenIzena { ... } Deklarazio explizitoa public class KlasearenIzena extends GurasoarenIzena { ... }
  • 16.
  • 17. Atributuen herentzia Klase baten protected edo public atributu guztiak bere seme-alabek heredatuko dituzte Ez private! Seme-alabek gurasoek definitu ez dituzten atributuak definitu ditzakete Seme-alabek ezin dute gurasoak definitutako atributuak kendu
  • 18. 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;
  • 20.
  • 21. Metodoen herentzia protected edo public diren metodo guztiak klase seme-alabetan heredatzen dira private ez! Klase seme-alabak metodo berriak definitu ditzake Gurasotik heredatutako kodea berdefinitu dezake Ezin du kendu, baina bai guztiz aldatu
  • 22. 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();
  • 23. 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();
  • 24. Super Konstruktorean Lehenengo sententzia klase gurasoaren konstruktorearen deia da super(param1, param2); Ez bada idazten, Javak inplizituki parametrorik gabeko konstructoreari deituko dio super(); Edozein metodoaren barnean, ”super.” erabiliz “this” erabiltzen dugun moduan super.metodo1(); // aitaren ‘‘metodo1’’ deitzen du
  • 25. Polimorfismoa Metodo bat deitzen duen objektuaren motaren arabera era desberdinean 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());
  • 26. Bateragarritasuna B klasea Aren semea bada, edozei B klasekoa den edozein objektu, A klasekoa izango da baita ere Gutxienez, B klaseko objektua A klaseko baten atributu eta metodo berdinak izango ditu Beraz, A klaseko objektuekin egin dezakegun edozein gauza, B klasekoekin ere egin dezakegu ¿Eta alderantziz? A obj1 = (A) obj2; // obj2 B klasekoa izanda Kastinga ez du aldatzen objektuaren balioa, bakarrik ikusten dugu ”beste ikuspegi batetik”, baina objektu bera da Bakarrik egin dezakegu hierarkian zehar, ez ”horizontalki”
  • 27. Bateragarritasuna Izen berdina duten zenbait metodo existitu daiteke Baldin eta parametro desberdinak jasotzen badute Kasurik argienak konstruktoreak dira public void pantailanErakutsi(String izena) { System.out.println(izena); } public void pantailanErakutsi(String izena, String abizena) { System.out.println(izena+" "+abizena); }
  • 28. Abstract Kontzeptuak modelatzeko Klase abstraktua Ezin da instantziatu (new KlaseAbs()), baina ondorengoak izan ahal ditu Ez ditu zertan metodo abstraktuak eduki behar Metodo abstraktua Implementaziorik 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 hori abstraktua deklaratu beharko da ere.
  • 29.
  • 30. 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...
  • 31. 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;
  • 32. Galderak: abstrakzioa Zein izan daiteke posible? Klase abstraktua A abstract da, A aldagaia = new A(); A ez da abstract, baina b() abstact metodoa du A abstract klasea da eta b() metodoa ez da abstract A abstract da eta b() metodo abstract-a du B ondorengoa du, eta honek e() eta d() metodoak definitzen ditu B aldagaia = new B();
  • 33. Galderak: herentzia a.a(); a.b(); Honako klase hierarkia edukita... a.d(); A klasea (a eta b metodoak) a.e(); B klasea (d metodo abstraktua) b.a(); C (e metodoa duena) b.b(); Posiblea da... b.d(); A a = new A(); b.e(); B b = new C(); c.a(); C c = new C(); c.b(); c.d(); c.e();
  • 34. Galderak: polimorfismoa (1) Honako hierarkia dugu Klase 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(); }
  • 35. 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!
  • 36. 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.