Seriál o výuce objektově orientovaného programování postupuje k podkapitolám 2.10 Kvalifikace a klíčové slovo this a 2.11 Metody vracející hodnotu. V minulém díle jsme si probrali definici atributů a definování vlastní metody.
2.10 Kvalifikace a klíčové slovo this
Název proměnné následovaný tečkou je označován jako kvalifikace metody, protože blíže určuje (kvalifikuje), o čí metodu se jedná, tj. které instance je ta metoda (které instanci posíláme zprávu). Technicky vzato, volanou metodu musíme mimo jiné kvalifikovat i proto, že potřebujeme, aby mohla pracovat s atributy metod dané instance. Kdybychom metodu nekvalifikovali, nebylo by jasné, s jakými atributy má pracovat.
Nyní hned trochu vyvrátím to, co jsem právě řekl. Překladač totiž ví, že volat nekvalifikovanou metodu instance je nesmysl, takže pokud tak učiním, tj. pokud v programu zavolám nekvalifikovanou metodu instance, pokusí se ji kvalifikovat tou instancí, jejíž metodu právě překládá. Podaří-li se mu to, je spokojen. Nepodaří-li se mu to, tj. není-li tato metoda pro danou instanci definována, ohlásí chybu překladu.
Ukažme si to na příkladu. V minulé kapitole jsme definovali metodu posunVpravo(int). Aby byla souprava metod symetrická, zkusme doplnit i metodu posunVlevo(int). Vzhledem k tomu, že posun vlevo je záporně zadaný posun vpravo, může být řešení velice jednoduché:
/**
* Posune stromek o zadany pocet bodu vlevo,
* pri zapornem parametru vpravo.
*
* @param bodu pocet bodu, o ktere se smrcek posune
*/
public void posunVlevo( int bodu )
{ //Pro posun vlevo musime zadat zapornou hodnotu
posunVpravo( -bodu );
}//public void posunVlevo( int bodu )
Příkaz v těle metody bychom mohli „převyprávět“: zavolej metodu posunVpravo(int) té instance, kterou já mám posunout vlevo.
Situaci, kdy si překladač kvalifikaci domyslí, označujeme jako implicitní kvalifikace, na rozdíl od explicitní kvalifikace, při níž programátor kvalifikuje metodu (nebo jinou část programu) sám.
Řada programátorů nerada vidí používání nekvalifikovaných (přesněji implicitně kvalifikovaných) atributů a metod a dává přednost důsledné explicitní kvalifikaci. K té slouží klíčové slovo this, které vždy zastupuje tu instanci, v jejíž metodě toto klíčové slovo použijeme. S použitím klíčového slova this bychom předchozí metodu zapsali:
public void posunVlevo( int bodu )
{ //Pro posun vlevo musime zadat zapornou hodnotu
this.posunVpravo( -bodu );
}//public void posunVlevo( int bodu )
Klíčové slovo this nám umožňuje kvalifikovat nejenom metody, ale i atributy. Při definici metod s parametrem se např. často stane, že nám jako nejvhodnější název parametru připadá název atributu, jehož hodnotu tento parametr nastavuje. V definici metody je pak ale třeba rozhodnout, o který z obou objektů se v tom kterém případě jedná.
Překladač se rozhoduje podle hesla „Bližší košile než kabát“. Při výběru objektu, který daný identifikátor označuje, dá přednost parametru před atributem, protože parametr byl definován „právě tady“ v hlavičce metody, kdežto atribut je definován kdesi zcela mimo metodu.
Budeme-li chtít překladač přesvědčit, že v tomto případě máme na mysli atribut, musíme atribut kvalifikovat klíčovým slovem this. Kdybychom v naší třídě měli např. atribut x, mohli bychom jeho nastavovací metodu definovat následovně:
public void setX( int x )
{
this.x = x;
}//public void setX( int x )
Rudolf Pecinovský
0 komentářů:
Okomentovat