| | |
| |
|
Објектно оријентирани концепти во Јава - Трет дел |
Напредно наследување: Override на методи. (override = надгласување, натфрлување)
Наследувањето го опишав во првиот дел од оваа серија на написи, но поради желбата да скратам нешто во тој сегмент испуштив една битна можност која ќе ја покријам сега, а тоа е override на методи. Како што веќе знаеш објект од класата „Jabolknica“ ги наследува сите можности на класата „Drvo“, според која и е базирана. Поради тоа „Jabolknica“ го има истиот метод „rastenje“ исто како и класата „Drvo“.
Но што доколку сакаш со самото растење на Jabolknicite да израснуваат и нови јаболка, нов плод? Секако дека можеш да ја повикаш методата „dodadiJabolko“ секојпат кога ќе ја повикаш и методата за растење на Jabolknica-та, но секако е многу поелегантно доколку Drva-та и Jabolknicite можеш да ги третираш на ист начин (на пример при повик на методата за растење), а секое од нив да го направи она што треба да го направи објект од негов тип.
За да може истата метода да прави нешто друго во подкласата мораш да направиш „override“ на таа метода со нова дефиниција во подкласата. Едноставно кажано треба да ја ре-декларираш „rastenje“ методата во класата „Jabolknica“ за да може истата да прави нешто друго. Еве еден пример за нова дефиниција на методата „rastenjе“ која можеш да ја искористиш во твојата класа „Jabolknica“:
public void rastenje(){
visina = visina + 1;
dodadiJabolko();
}
Едноставно нели? Но што ако се додаде нова функционалност во методата „rastenje“ во основната класа „Drvo“? Како да се осигураме дека таа функционалност ќе биде наследена и од класата „Jabolknica“? Слично како и кај overload-увањето на методи, каде што имплементираме едноставна метода со специјален повик до некоја посложена метода, и овде можеме да дефинираме метода во подкласата и да направиме повик до истата метода од основната класа:
public void rastenje(){
super.rastenje();
dodadiJabolko();
}
Линијата „super.rastenje();“ го прави повикот до методата во основната класа, а со самото тоа не поштедува од измислување на тркалото по вторпат. Ова посебно се наоѓа при рака кога наследуваш некоја класа и ја прошируваш нејзината функционалност а го немаш изворниот код од таа класа. Со едноставен повик до методата која се наоѓа во основата класа (или суперкласа), а ти ја override-уваш во твојата нова класа, можеш да се осигураш дека твојот објект не губи на основна функционалност.
Исто така и конструкторите можат да бидат override-увани како нормално методи. Еве неколку примери:
private int vkupnoJabolka;
public Jabolknica(){
super();
vkupnoJabolka = 0;
}
public Jabolknica(int visina){
super(visina);
vkupnoJabolka = 0;
}
public Jabolknica(int visina, int vkupnoJabolka){
super(visina);
if (vkupnoJabolka < 0) this.vkupnoJabolka = 0;
else this.vkupnoJabolka = vkupnoJabolka;
}
Првите два контрсуктори го override-уваат еквивалентиот конструктор во класата „Drvo“ додека третитот е сосема нов конструктор. Приметуваш дека конструкторот од основата класа го повикуваме со „super()“. Сите три конструктори го повикуваат конструкторот од основната класа за да се дојде до осигурување дека нема да има губење на функционалност.
|
|
|
|
|
|
| |
|
|
---|
JavaTM и Java-базираните ознаки се трговски марки или регистрирани трговски марки на Sun Microsystems, Inc. во САД и други држави. Java.com.mk никако не соработува со Sun Microsystems, Inc. Сите други трговски марки се сопственост на нивните сопственици. |
|