Rune Zedeler <rz@daimi.au.dk> writes:
> Det siges at instanceof er en slem ting og kun bør bruges i sammenligninger.
>
> Hvordan undgår jeg instanceof i nedenstående?
....
> Number times(Number other) {
> // hvordan undgår jeg instanceof her?
> if (other instanceof RationalNumber)
> return times((RationalNumber)other);
> else
> return other.times(this);
Først og fremmest tager du en beslutning:
Skal et RationalNumber kunne ganges med ethvert andet Number eller ej?
Hvad nu hvis "other" i det ovenstående var en anden Number-implementation
der havde en lignende "times"-metode. Så ville de to stå og kalde hinanden
frem og tilbage, indtil stakken løber over.
Det er farligt at antage at "hvis jeg ikke ved hvordan vi skal gange,
så gør den anden nok", med mindre du har fuldstændig styr på hvilke
klasser der findes, og RationalNumber er den eneste med den tilgangsvinkel.
Skal "times"-metoden være kommutativ? Altså giver
n1.times(n2)
altid det samme som
n2.times(n1)
uafhængigt af hvilke Number-klasser der bruges?
Hvad skal værdien være?
Grunden til at man siger at instanceof er slem er at det nemt bryder
med Lisskovs substitutionsprincip: Enhver instans af en subklasse kan
bruges hvor et superklasse-objekt forventes.
Her forventes et Number-objekt, men metoden opfører sig forskelligt
alt efter hvilken subklasse der kommer ind. Det kan være godt nok,
men man skal holde tungen lige i munden. Hvis man ikke kender alle
subklasser, så skal man have en default-opførsel alligevel, og
så bør man overveje om det ikke er den rigtige opførsel i alle
tilfælde.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:
http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'