[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