200 likes | 961 Views
Dedovanje. Pogosto uporabljani postopki I. Imamo razred Ulomek Denimo, da z ulomki zelo pogosto izvajamo določen postopek npr. jim spremnimo predznak Napišemo ustrezno metodo Vedno, ko želimo ulomkom spreminjati predznak, moramo napisati to metodo
E N D
Pogosto uporabljani postopki I Imamo razred Ulomek Denimo, da z ulomki zelo pogosto izvajamo določen postopek npr. jim spremnimo predznak Napišemo ustrezno metodo Vedno, ko želimo ulomkom spreminjati predznak, moramo napisati to metodo Naredimo iz nje knjižnico – "zaprimo v svoj razred" Ampak to ni "objektno" Znanje spreminjanja predznaka je ulomku želvi – objektu Ulomek (objekt) naj bi znala spremniti predznak Odzvati se metodi spremeniPredznak: nekUlomek.spremeniPredznak() Imamo Ulomek.java Ni problem, dopišemo metodo Popravljati dobro preizkušen razred? ... Do not fix, until you are completely desperate ... Kaj pa, če izvorne kode nimamo?
Dedovanje "razširjanje" objektov extends Naredimo načrt za razred boljših ulomkov Boljši: Znajo spremniti predznak public class BoljsiUlomek extends Ulomek Vsaka boljši ulomek "zna" vse, kar zna običpajni ulomek iz razreda Ulomek in morda še kaj Ima ista stanja/lastnosti Morebiti tudi dodatna
Razred BoljsiUlomek public class BoljsiUlomek extends Ulomek { // naredimo nov razred "boljših ulomkov" public void spremeniPredznak() { // Vsaka boljši ulomek si zna // spremeniti predznak Ulomek pom = new Ulomek(-1, 1); this.pomnozi(pom);// lahko tudi brez this// metoda pomnozi je podedovana iz razreda Ulomek } }
Uporaba Boljšega ulomka public class Test4{ public static void main(String[] args) { BolsiUlomekboUl; boUl = new BoljsiUlomek(); // "ustvarimo" boljši ulomek Ulomek navadniUl = new Ulomek(); // spremenimo predznak navadnega ulomka navadniUl.pomnozi(new Ulomek(-1,1)); // "čaramo" boUl.spremeniPredznak(); // pri "boljših" ulomkih je zadeva // elegantnejša } }
Pogosto uporabljani postopki II Denimo, da imamo na voljo razred Turtle. S tem razredom znamo ustvariti objekt, želvo, ki zna reagirati na ukaze (pozna metode) fd(int n) rt(int st) penUp() penDown() Zgled Denimo, da z želvo zelo pogosto izvajamo določen postopek Npr. rišemo kvadrat Napišemo ustrezno metodo
Pogosto uporabljani postopki IIa Vedno, ko z želvo rišemo kvadrate, moramo napisati to metodo Naredimo iz nje knjižnico – "zaprimo v svoj razred" ZelvaKvadrat.java Ampak to ni "objektno" Znanje risanja kvadratov je lastno želvi – objektu Želva (objekt) naj bi znala narisati kvadrat Odzvati se metodi kvadrat: nekaZelva.kvadrat(100) Imamo Turtle.java Ni problem, dopišemo metodo Kaj pa, če izvorne kode nimamo?
Dedovanje "razširjanje" objektov extends Naredimo načrt za razred pametnih želv Znajo risati kvadrate public class PametnaZelva extends Turtle Vsaka pametna želva "zna" vse, kar zna razred Turtle in morda še kaj Ima ista stanja/lastnosti Morebiti tudi dodatna
Razred PametnaZelva public class PametnaZelva extends Turtle { // naredimo nov razred "pametnih zelv" public void kvadrat(int velikost) { // Vsaka pametna zelva ve, kako se nariše // kvadrat s stranico velikost int i = 1; while (i <= 4) { this.fd(velikost);// lahko tudi brez this// metoda fd je podedovana iz razreda Turtle this.rt(90); // metoda rt je podedovana iz razreda Turtle } }
Naredimo pametno želvo public class Zelva4{ public static void main(String[] args) { PametnaZelva zelvak; // zelvak bo ime moje pametne želve zelvak = new PametnaZelva(); // "ustvarimo" "pametno" želvo // naj želva zelvak nariše kvadrat // ker je pametna, ji ni potrebno posredovati // podrobnih navodil, ampak le ukaz za risanje kvadrata zelvak.kvadrat(40); } }
Dedovanje Izpeljava novih razredov iz obstoječih Uvajanje dodatnih metod Lahko tudi dodatne lastnosti (podatki) Primer: matrike Seštevanje, odštevanje, množenje Kvadratne matrike / class KvMatrike extends Matrike Ker je razred izpeljan – ni potrebno na novo pisati metod za seštevanje, odštevanje, množenje Možne dodatne operacije Inverz, deljenje, …
Dedovanje Hierarična zgradba razredov Vrhnji objekt Object Iz njega izpeljani vsi drugi razredi Če ne napišemo extends … extends Object Ima metodo toString() Zato jo "imajo" vsi razredi “specializacija” objektov
Dedovanje Sestavi razred Zlatnik, ki deduje iz razreda Kovanec. Zlatnik ima poleg osnovnih lastnosti kovanca podano še gostoto materiala, iz katerega je izdelan, čistočo zlata (podano z realnim številom med 0 in 1) in vrednost čistega zlata na masno enoto. Razred naj pozna tudi metodo double Vrednost(), ki vrne vrednost zlatnika.
Dedovanje "razširjanje" objektov extends Naredimo načrt za razred Zlatnik Kovanec s posebnimi lastnostmi public class Zlatnik extends Kovanec Vsaka zlatnik "je in zna" vse, kar zna kovanec in morda še kaj Vrednost čistega zlata je enaka za VSE zlatnike razredna spremenljivka (static)
Zlatnik public class Zlatnik extends Kovanec { private static double vrednostCistegaZlata = 125.4; // za vse zlatnike je to enako! private int polmer; private int visina; private double gostota; private double cistost; // "SET" metode public boolean nastaviPolmer(int r) { } public boolean nastaviVisino(int visina) { } public void nastaviGostoto(double x) { } public void nastaviCistost(double x) { } public static void nastaviVrednostCistegaZlata(int v) { } // vrednost lahko spreminajmo tudi, // ce se ni nobenega zlatnika! // "GET" metode public int povejPolmer() { } public int povejVisino() { } public double povejGostoto() { } public double povejCistost() { } public static double povejVrednostCistegaZlata() { } // vrednost lahko zvemo tudi, // ce se ni nobenega zlatnika! // toString public String toString() { } // podedovana toSTring metoda nam ne ustreza! // "znanje" public double volumen() { } public double povrsina() { } public double vrednost() {} }
Iz muhe slon Ne, iz muhe ne bomo naredili slona, ampak pri nas zajci postanejo ovce Pri nas se je oglasil bogati Rus, ki je bil tako navdušen nad našim programom za vodenje farme zajcev, da hoče, da mu zanj pripravimo podoben program Posebno nad metodo meNapojiti() je bil navdušen! A žal on ne vodi farme zajcev, ampak farmo ovac. Poleg tega, da ovce redi za zakol, prodaja tudi njihove kožuhe, zato bi rad, da vodimo še barvo njihovega kožuha.
Osnova: razred ZajecNov Kakšne spremembe so potrebne Napačne lastnosti OsnovaSerijska ni OK Prav tako MAX_TEZA Dodati lastnosti Barva kožuha Get/set metodi denimo, da si tudi ovce barvajo kožuhe Popraviti konstruktor Dodati metodo toString V razredu ZajecNov smo nanjo pozabili!
Prekrite metode V predniku (neposrednem – extends … ali posrednem) definirana metoda nam ne ustreza Predefiniranje: prekrite metode Overriding Enak podpis metode kot pri predniku – velja naša definicija toString() Predefiniranje lahko tudi preprečimo O tem kdaj drugič …
"Umazane" podrobnosti super() serijska ponovno! ker zaradi private ne moremo do serijska iz ZajecNov povejSerijska() na novo enaka že v ZajecNov Razlog: nova spremenljivka serijska če ne navedemo - metoda bi vračala serijsko iz zajcev!!
Uporaba public class Ovce { public static void main(String[] ar) { Ovca z1 = new Ovca(); System.out.println(z1); System.out.println(z1.povejSerijsko()); z1.nastaviBarvo("rdeča"); System.out.println(z1); System.out.println(z1.povejSerijsko()); z1.spremeniTezo(12); System.out.println(z1 + " Vredna sem " + z1.vrednost(12.8)); } }