[JavaTech] return type override

Viktor Szathmary vszathmary at freshdirect.com
2001. Dec. 11., K, 14:51:44 CET


hi,

> En ertem mit jelent a return type ovveride, csak azt 
> nem kapisgalom hirtelen, hogy mikor jo az nekem,
> van ertelmes felhasznalasa ennek valamikor?

peldaul: clone() eseteben mindenkepp ertelmes lenne.
vagy mittomen vmi frameworkot epitenel, ahol az alaposztalyban
definialsz egy
PrimaryKey getPK() -t.. (PrimaryKey legyen abstract) es a subclassokhoz
tartozna egy sajat AkarmiPrimaryKey osztaly...

vagy pl. vegyuk az iteratorokat.
abstract class Gyoker {
 Iterator iterator();
}
class Akarmi extends Gyoker {
 ValamiIterator iterator();
}

class ValamiIterator implements Iterator {
  Valami next();  // Object next() helyett
}

igy csinalhatnal castolas nelkul ilyet:
Valami v = akarmi.iterator().next();

>  void process( BlahTarolo cucc ) {
>     Blah jaj = cucc.getBlah();
>       itt a VM kitalalja hogy most Blah getBlah()-ot hivja meg,
>       vagy inkabb a SubBlah getBlah()-ot? 
>       a vissateresi ertek alapjan biztoasan megteheti,
>       de mi van, ha en reflekciozok, es azt mondom, hogy

> class Cuccos implements SubBlahTarolo {
>  Blah getBlah(); 
>  SubBlah getBlah();
> }

namost.. en ugy kepzelem, hogy csak specifikusabba lehessen tenni a
visszateresi tipust. az utobbi amit irtal legyen illegalis: ugyanazt a
metodust definialtad ketszer. aki a SubBlahTarolot implementalja, mar
csak SubBlah getBlah()-t, vagy annal specifikusabbat csinalhat.

az meg hogy mikor mit vesz, forditasi idoben eldontheto. egy szimpla
implementacio elkepzelheto barmilyen VM modositas nelkul is: fuggoen
attol hogy a hivott objektum tipusa mi (a forditaskor tudhato tipusa!),
annak megfelelo visszateresi erteket hasznalna.. szerintem ez teljesen
intuitiv a programozonak is, a forditonak sem bonyolult..

azaz ezek legalisak SubBlahTarolo t=... eseten:
SubBlah sb = t.getBlah();
Blah b = t.getBlah();
Object o = t.getBlah();
SubBlah sb1 = (SubBlah)b;
SubBlah sb2 = (SubBlah)o;

viszont ha mar elveszited a tipusinformaciot (pl igy: BlahTarolo t2 = t)
mar csak ezt teheted:

Blah b = t2.getBlah();
SubBlah sb = (SubBlah)t2.getBlah();  		// castolni kell
SubBlah sb2 = ((SubBlahTarolo)t2).getBlah();	// de igy is lehet,
ugyanazt kapod

 
> class Cuccos implements SubBlahTarolo {
>  SubBlah getBlah();
> }
> 
> De akkor mit csinalok olyan esetben, amikor nekem csak Blah kellene?
> 
> Letrehozom csak azert a SubBlahot (esetleg 100x annyi eroforrast
> felhasznalva)
> hogy legyen egy Blahom?

nem. egyszeruen csak nem szukitened le a visszateresi tipust ilyen
esetekben, ha nem tudod biztosan hogy mindig SubBlah-t kell visszaadnia,
hanem lehet vmi mas, Blah-bol orokitett dolgot...

remelem igy vilagosabb, mire gondolok :)

jo castolast,
	viktor :)



További információk a(z) JavaTech levelezőlistáról