Dedovanje

Iz MaFiRaWiki

Ta članek ali del članka je v delu. Veseli bomo, če ga boste dopolnili in popravili.

Kaj pomeni to opozorilo?

Vsebina

Kratek opis

Dedovanje je programerski postopek, s katerim organiziramo in povežemo razrede, ki sestavljajo program. Dedovanje je "razširjenje" objektov oziroma izpeljava novih razredov iz obstoječih, pri čemer uvajamo tudi dodatne metode, lahko tudi dodatne lastnosti (podatke).

Z izpeljevanjem novih razredov iz že obstoječega organiziramo razredne hierarhije, kjer so splošni razredi višje, specializirani pa nižje v hierarhiji.

Na primer

Imamo razred A, predstavljen z določeno množico spremenljivk. Nato želimo napisati nov razred B, ki se razlikuje le v eni dodatni spremenljivki. Namesto, da bi ponovno pisali isto kodo in dodali eno vrstico zaradi te dodatne spremenljivke, lahko s pomočjo programerskega postopka, dedovanja, izpeljemo razred B iz razreda A. Torej, novi razred B ima vse lastnosti in metode, kot že obstoječi razred A, dodamo mu le dodatno spremenljivko. Pravimo, da smo razred B izpeljali iz razreda A.

Dedovanje v Javi

V Javi povemo, da je en razred podrazred nekega drugega razreda z določilom extends, ki pomeni razširi.

  1. public class B extends A {
  2. ...
  3. }

Razred B podeduje vse lastnosti in metode od razreda A. Objekti razreda A so hkrati objekti razreda B.

Vsi razredi pa so izpeljani iz razreda java.lang.Object. Le da tega ni potrebno pisati.

  1. public class A { //public class A extends Object
  2. ...
  3. }

Primer dedovanja

Denimo, da pišemo program, v katerem imamo opravka z geometrijskimi liki, kot so trikotnik, krog, kvadrat, ipd. Za vsak lik poznamo njegovo lego (x, y) v ravnini. Denimo, da mora program znati translirati lik za dani vektor in izračunati njegovo ploščino. Torej, definirali bomo splošen razred Lik, ki bo vseboval lastnosti in metode, ki so skupne vsem likom. Podrazredi Trikotnik, Krog in Kvadrat, izpeljeni iz nadrazreda Lik, pa bodo vsebovali vse kar je specifično za vsak posamezen lik.

Na primer, pozicija na ravnini je vsem likom skupna, zato je to del razreda Lik. Krog ima polmer r, kvadrat ima dolžino stranice a, trikotnik pa ima pozicije oglišč. To so podatki, ki spadajo v vsak posamezni razred.


nadrazred Lik

  1. public abstract class Lik {
  2. double x;
  3. double y;
  4.  
  5. public Lik(double x, double y) {
  6. this.x = x;
  7. this.y = y;
  8. }
  9.  
  10. public void transliraj(double dx, double dy) {
  11. x = x + dx;
  12. y = y + dy;
  13. }
  14.  
  15. public abstract double ploscina();
  16. }

Razred Lik vsebuje komponenti x, y in objektno metodo transliraj (double dx, double dy). Vsebuje tudi abstraktno deklaracijo metode ploscina(). S to deklaracijo povemo, da mora vsak podrazred razreda Lik definirati tako metodo. Razred Lik ne vsebuje metode ploscina(), saj za splošni lik ne moremo definirati metode, ki izračuna njegovo ploščino. Zato pravimo, da je metoda ploščina samo abstraktno deklarirana. Kadar je v razredu deklarirana abstraktna metoda, s tem tudi celoten razred postane abstrakten, kar povemo z določilom abstract.

podrazred Krog

  1. public class Krog extends Lik {
  2. double r; // polmer
  3.  
  4. public Krog(double x, double y, double r) {
  5. super(x, y);
  6. this.r = r;
  7. }
  8.  
  9. public double ploscina() {
  10. return Math.PI * r * r;
  11. }
  12. }

Ker je razred Krog definiran z določilom extends Lik, vsebuje vse komponente, ki jih vsebuje razred Lik. Torej vsebuje tri komponente x, y in r ter dve metodi, transliraj (double dx, double dy) in ploscina(). Z določilom super pokličemo konstruktor iz nadrazreda.

podrazred Kvadrat

  1. public class Kvadrat extends Lik {
  2. double a; // dolzina stranice
  3.  
  4. public Kvadrat(double x, double y, double a) {
  5. super(x, y);
  6. this.a = a;
  7. }
  8.  
  9. public double ploscina() {
  10. return a * a;
  11. }
  12. }

Razred Kvadrat vsebuje tri komponente x, y in a ter dve metodi, transliraj (double dx, double dy) in ploscina().

podrazred Trikotnik

  1. public class Trikotnik extends Lik {
  2. double x2, y2; // drugo oglisce
  3. double x3, y3; // tretje oglisce
  4.  
  5. Trikotnik(double x, double y, double x2, double y2, double x3, double y3) {
  6. super(x, y);
  7. this.x2 = x2; this.y2 = y2;
  8. this.x3 = x3; this.y3 = y3;
  9. }
  10.  
  11. public double ploscina() {
  12. return 0.5 * Math.abs(x3*y - x2*y + x*y2 - x3*y2 - x*y3 + x2*y3);
  13. }
  14. }

Razred Trikotnik pa vsebuje šest komponent x, y, x2, y2, x3, y3 ter dve metodi, transliraj (double dx, double dy) in ploscina().

Glej tudi

Osebna orodja