multimetodit OO:ssa

Lukekaa tarkkaan, törmäätte tähän joskus kuitenkin (example-kohta selventää ongelmaa, jos ei muuten tuttu):
http://en.wikipedia.org/wiki/Multiple_dispatch

Henkilökohtaisesti törmäsin aikoinaan ko. ongelmaan jo muutaman viikon C :n opiskelun aikana. Aluksi oletin että C hoitaa homman automaattisesti ajon aikana, koska sitä polymorfismia oli niin hehkutettu. Mitään siistiä ratkaisua en löytänyt, joka aiheutti "slarba otsassa"-ilmiötä, eteenkin kun Stroustrup lupaili kymmentä kivaa ja kahtatoista kaunista "klasikko" C ohjelmointi kirjassaan (jota käytin oppikirjana. http://www.huuto.net/fi/showitem.php3?itemid=52366529 Taidan poltaa ko. opuksen). Olisi ollut rehellistä kertoa ettei kieli tue muuta kuin "single dispatch":ä, mutta eihän sitä 942 sivuun mahtunut. Vituttaa vieläkin.

Ihmeellistä on Lispin pioneerisuus tässäkin tapauksessa ja johtavien OO-kielten (C , Java) alkeellisuus. (Lisää esim. http://www.paulgraham.com/icad.html kohta "What Made Lisp Different").
6348
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Mä oikeastaan olisin sitä mieltä että tuommoiseen joutuminen johtuu ainoastaan huonosta suunnittelusta... Ton saa aina jotenkin (helposti) kierrettyä.

Nojoo mutta lispi näyttää hanskaavan tommosen paremmin, totta...

Äänestä
  • "johtuu ainoastaan huonosta suunnittelusta..."

    Ei johdu, oikeasti ei ole muita vaihtoehtoja. Pohdi tuota wikin esimerkkiä, niin huomaat/ymmärrät.

    Äänestä

  • *palle* kirjoitti:

    "johtuu ainoastaan huonosta suunnittelusta..."

    Ei johdu, oikeasti ei ole muita vaihtoehtoja. Pohdi tuota wikin esimerkkiä, niin huomaat/ymmärrät.

    Otetaan Java-versio...

    class Asteroid extends Thing {
    public void collide_with(Thing other) {
    }
    }

    Ton tilalle

    class Asteroid extends Thing {
    public void collide_with(Asteroid a) {
    }
    public void collide_with(SpaceShip a) {
    }
    }

    Vaihtoehto? Kaks metodia juu, mutta ei taida olla hirveän paljoa työläämpää kirjoittaa kuin if-tarkistusta tuonne yhden metodin sisään.

    Äänestä

  • Nimimerkki kirjoitti:

    Otetaan Java-versio...

    class Asteroid extends Thing {
    public void collide_with(Thing other) {
    }
    }

    Ton tilalle

    class Asteroid extends Thing {
    public void collide_with(Asteroid a) {
    }
    public void collide_with(SpaceShip a) {
    }
    }

    Vaihtoehto? Kaks metodia juu, mutta ei taida olla hirveän paljoa työläämpää kirjoittaa kuin if-tarkistusta tuonne yhden metodin sisään.

    No kokeilepas toimiiko. Tarkoitushan on että jossain vaihessa käydään luupissa läpi kaikki Thing-oliot. Eli jos ne on taulukossa niin tulisi jotain:
    thing[i].collide_with(thing[j]);

    Äänestä

kaikkeen ei oop-lähestymistapa ja esim. juuri tuossa esimerkissä voisi olla parempi käyttää ulkopuolista luokkaa joka handlaa törmäykset tyyliin

public class CollisionManager
{
static int handleCollision(Box v, Sphere v)
static int handleCollision(Box v, Polyhedra v)
static int handleCollision(Sphere v, Polyhedra v)
...
}

sen sijaan että kapseloi luokan sisälle oop-tyyliin

public class Box extends Obj3D
{
int handleCollision(Sphere v);
int handleCollision(Polyhedra v);
}

public class Sphere Obj3D
{
int handleCollision(Box v);
int handleCollision(Polyhedra v);
}

...

Äänestä

Kommentoi aloitusta


*palle* kirjoitti:

Lukekaa tarkkaan, törmäätte tähän joskus kuitenkin (example-kohta selventää ongelmaa, jos ei muuten tuttu):
http://en.wikipedia.org/wiki/Multiple_dispatch

Henkilökohtaisesti törmäsin aikoinaan ko. ongelmaan jo muutaman viikon C :n opiskelun aikana. Aluksi oletin että C hoitaa homman automaattisesti ajon aikana, koska sitä polymorfismia oli niin hehkutettu. Mitään siistiä ratkaisua en löytänyt, joka aiheutti "slarba otsassa"-ilmiötä, eteenkin kun Stroustrup lupaili kymmentä kivaa ja kahtatoista kaunista "klasikko" C ohjelmointi kirjassaan (jota käytin oppikirjana. http://www.huuto.net/fi/showitem.php3?itemid=52366529 Taidan poltaa ko. opuksen). Olisi ollut rehellistä kertoa ettei kieli tue muuta kuin "single dispatch":ä, mutta eihän sitä 942 sivuun mahtunut. Vituttaa vieläkin.

Ihmeellistä on Lispin pioneerisuus tässäkin tapauksessa ja johtavien OO-kielten (C , Java) alkeellisuus. (Lisää esim. http://www.paulgraham.com/icad.html kohta "What Made Lisp Different").

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu