Run-time type information

RTTI-kysyjä

Osaako joku selittää mihin käytetään Run-time type informaatiota?


Mitä hyötyä on siitä että joku vaikkapa painonapista on RTTI-versio verrattuna normaaliin?

6

400

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 2342345sff

      Voi olla että menee väärin tämä selitys...

      Sitä käytetään selvittämään ajonaikaisesti mikä on olion luokka. Jos oliosta ei ole saatavilla ajonaikaista tyyppi tietoa (RTTI), niin silloin ei voida selvittää ajonaikaisesti sitä, mihin luokkaan olio kuuluu.

      Esimerkki. Levyn soitto ohjelmassa "Soita kappale" -tapahtuman voi laukaista painonapista tai valikkoriviltä. Kun kyseisen soitto tapahtuman laukaisee, välittyy ns. tapahtumankäsittäjälle tapahtumannumero ja viittaus olioon joka aiheutti tapahtuman laukaisun. Jos oliosta ei ole nyt saatavilla RTTI tietoa niin silloin tapahtuman käsittelijä ei voi selvittää sille välitetyn olion tyyppiä, eli laukaisiko tapahtuman paino nappi vai valikkovalinta.

      Jos siis on on pelkkä olio nimeltä Object eikä siihen ole liitetty ajon aikaista tyyppi tietoa, niin sen luokkaa ei voida selvittää, eikä tyyppi muunnosta tehdä voida tehdä turvallisesti.




      if (olio is Button) // RTTI tarkastusI
         ((Button) olio)->SetText("Pysäytä") // Tyyppi muunnos
      else if (olio is MenuItem) // RTTI tarkastus
         ((MenuItem) olio)->Disable(); // Tyyppi muunnos

      • TRRY

        Edellisen lisäksi RTTI:llä pääsee näköjään penkomaan olioiden attribuutteja ja metodejakin. Toisin sanoen, RTTI mahdollistaa jossain määrin reflektiivisen ohjelmoinnin Delphissä. "Jossain määrin" sen takia, että reflektiiviseen ohjelmointiin kuuluu ohjelma rakenteiden tarkastelun lisäksi myös niiden muuttaminen. En osaa sanoa, onko Delphissä mahdollista lisätä olioon uutta metodia ohjelman ajon aikana, mutta olemassa olevan korvaaminen toisella taitaa onnistua (typinfo-moduulin SetMethodProp:n avulla).

        Seuraavassa proseduuri, joka ottaa ensimmäiseksi parametriksi minkä tahansa olion ja toiseksi metodin nimen (merkkijono). Proseduuri selvittää onko oliolla annetun nimistä metodia. Jos ei, niin ei sitten mitään. Jos on, niin kutsutaan sitä.

        procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string) ;
        var
        Routine: TMethod;
        Exec: TExec;
        begin
        Routine.Data := Pointer(OnObject) ;
        Routine.Code := OnObject.MethodAddress(MethodName) ;
        if NOT Assigned(Routine.Code) then Exit;
        Exec := TExec(Routine) ;
        Exec;
        end;

        Poimin esimerkin sivulta

        http://delphi.about.com/cs/adptips2004/a/bltip0204_3.htm

        RTTI:llä voi muuttaa myös enumeraatioiden alkioiden nimet merkkijonoiksi ja kirjoittaa read-only propertyihin, kuten seuraavan sivun linkeissä esitetään:

        http://delphi.about.com/od/oopindelphi/a/delphirtti.htm

        Reflektion ja RTTI:n kannalta mielenkiintoinen moduuli on Delphissä ja Free Pascalissa on typinfo. Sieltä löytyy funktioita myös muiden temppujen tekoon:

        http://www.freepascal.org/docs-html/rtl/typinfo/index.html


      • Delphiguru80
        TRRY kirjoitti:

        Edellisen lisäksi RTTI:llä pääsee näköjään penkomaan olioiden attribuutteja ja metodejakin. Toisin sanoen, RTTI mahdollistaa jossain määrin reflektiivisen ohjelmoinnin Delphissä. "Jossain määrin" sen takia, että reflektiiviseen ohjelmointiin kuuluu ohjelma rakenteiden tarkastelun lisäksi myös niiden muuttaminen. En osaa sanoa, onko Delphissä mahdollista lisätä olioon uutta metodia ohjelman ajon aikana, mutta olemassa olevan korvaaminen toisella taitaa onnistua (typinfo-moduulin SetMethodProp:n avulla).

        Seuraavassa proseduuri, joka ottaa ensimmäiseksi parametriksi minkä tahansa olion ja toiseksi metodin nimen (merkkijono). Proseduuri selvittää onko oliolla annetun nimistä metodia. Jos ei, niin ei sitten mitään. Jos on, niin kutsutaan sitä.

        procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string) ;
        var
        Routine: TMethod;
        Exec: TExec;
        begin
        Routine.Data := Pointer(OnObject) ;
        Routine.Code := OnObject.MethodAddress(MethodName) ;
        if NOT Assigned(Routine.Code) then Exit;
        Exec := TExec(Routine) ;
        Exec;
        end;

        Poimin esimerkin sivulta

        http://delphi.about.com/cs/adptips2004/a/bltip0204_3.htm

        RTTI:llä voi muuttaa myös enumeraatioiden alkioiden nimet merkkijonoiksi ja kirjoittaa read-only propertyihin, kuten seuraavan sivun linkeissä esitetään:

        http://delphi.about.com/od/oopindelphi/a/delphirtti.htm

        Reflektion ja RTTI:n kannalta mielenkiintoinen moduuli on Delphissä ja Free Pascalissa on typinfo. Sieltä löytyy funktioita myös muiden temppujen tekoon:

        http://www.freepascal.org/docs-html/rtl/typinfo/index.html

        Ei nyt sentään voi RTTI:llä lisätä uusia metodeja suorituksen aikana luokkiin!

        Tuollaisia temppuja voi tehdä vain suoraan konekielikoodia puukottamalla, mutta huoimaa: jos teet tuollaisia temppuja, niin koodisi ei välttämättä enää toimi samoin (oikein) Delphin eri versioilla käännettäessä. Ohjelmastasi siis tulee Delphin määrättyyn versioon sidottu, jos käytät tuollaisia matalan tason temppuja kuten konekielikoodin suora muokkaaminen suorituksen aikana.

        Jos nyt joku tuollaisia temppuja silti haluaa harrastaa, niin Delphin @ -operaattorilla (address of) saa esim. funktion / proseuurin / metodin alkuosoitteen selville.


      • Sisua Scripteihin
        Delphiguru80 kirjoitti:

        Ei nyt sentään voi RTTI:llä lisätä uusia metodeja suorituksen aikana luokkiin!

        Tuollaisia temppuja voi tehdä vain suoraan konekielikoodia puukottamalla, mutta huoimaa: jos teet tuollaisia temppuja, niin koodisi ei välttämättä enää toimi samoin (oikein) Delphin eri versioilla käännettäessä. Ohjelmastasi siis tulee Delphin määrättyyn versioon sidottu, jos käytät tuollaisia matalan tason temppuja kuten konekielikoodin suora muokkaaminen suorituksen aikana.

        Jos nyt joku tuollaisia temppuja silti haluaa harrastaa, niin Delphin @ -operaattorilla (address of) saa esim. funktion / proseuurin / metodin alkuosoitteen selville.

        Oletko tutustunut Pascal Script:n?
        http://remobjects.com/?ps


      • Kolme kysymystä
        TRRY kirjoitti:

        Edellisen lisäksi RTTI:llä pääsee näköjään penkomaan olioiden attribuutteja ja metodejakin. Toisin sanoen, RTTI mahdollistaa jossain määrin reflektiivisen ohjelmoinnin Delphissä. "Jossain määrin" sen takia, että reflektiiviseen ohjelmointiin kuuluu ohjelma rakenteiden tarkastelun lisäksi myös niiden muuttaminen. En osaa sanoa, onko Delphissä mahdollista lisätä olioon uutta metodia ohjelman ajon aikana, mutta olemassa olevan korvaaminen toisella taitaa onnistua (typinfo-moduulin SetMethodProp:n avulla).

        Seuraavassa proseduuri, joka ottaa ensimmäiseksi parametriksi minkä tahansa olion ja toiseksi metodin nimen (merkkijono). Proseduuri selvittää onko oliolla annetun nimistä metodia. Jos ei, niin ei sitten mitään. Jos on, niin kutsutaan sitä.

        procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string) ;
        var
        Routine: TMethod;
        Exec: TExec;
        begin
        Routine.Data := Pointer(OnObject) ;
        Routine.Code := OnObject.MethodAddress(MethodName) ;
        if NOT Assigned(Routine.Code) then Exit;
        Exec := TExec(Routine) ;
        Exec;
        end;

        Poimin esimerkin sivulta

        http://delphi.about.com/cs/adptips2004/a/bltip0204_3.htm

        RTTI:llä voi muuttaa myös enumeraatioiden alkioiden nimet merkkijonoiksi ja kirjoittaa read-only propertyihin, kuten seuraavan sivun linkeissä esitetään:

        http://delphi.about.com/od/oopindelphi/a/delphirtti.htm

        Reflektion ja RTTI:n kannalta mielenkiintoinen moduuli on Delphissä ja Free Pascalissa on typinfo. Sieltä löytyy funktioita myös muiden temppujen tekoon:

        http://www.freepascal.org/docs-html/rtl/typinfo/index.html

        Mihin koodinmuokkausta suoritusaikana käytetään?
        Osaatko selittää miksi nämä ovat tärkeitä asioita?
        Miten tämä asia "kierrettiin" aikaisemmin ?


      • TRRY
        Kolme kysymystä kirjoitti:

        Mihin koodinmuokkausta suoritusaikana käytetään?
        Osaatko selittää miksi nämä ovat tärkeitä asioita?
        Miten tämä asia "kierrettiin" aikaisemmin ?

        koska tämä ei ole enää RTTI-asiaa.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Valtion alijäämä = yritystukien määrä = 10 mrd. euroa

      Mutta persut eivät vaan suostu tasapainottamaan valtion budjettia, vaikka yritystuet on tiedetty haitallisiksi. Miksi p
      Maailman menoa
      41
      6105
    2. Suomi käyttää sosiaalietuuksiin suhteessa eniten rahaa koko maailmassa

      Suomi käyttää sosiaaliturvaetuuksiin enemmän rahaa suhteessa bruttokansantuotteeseen kuin mikään muu maa maailmassa. Su
      Maailman menoa
      309
      5054
    3. Poliisien suosikkipuolueet ylivoimaisesti: Kokoomus ja persut

      samoin on armeijan henkilöstön kanssa. Sen sijaan sekä vihreät, vasliitto ja SDP ovat hyljeksittyjä puolueita poliisien
      Maailman menoa
      160
      4854
    4. Sdp, Vihreät ja vasemmistoliitto muuttumassa naisten puolueiksi?

      Sdp 64 % naisia, vihreät 70 % naisia ja vasemmistoliitto 60 % naisia. Ilmankos ne puolueet ajaa autoilevien kantasuomal
      Maailman menoa
      136
      4662
    5. Epäonnistunut "Tuppurais-operaatio" kaatoi Purran hallituksen

      Persut yrittivät viimemetreillä häivyttää omaa täydellistä epäonnistumistaan syyttämällä opposition edustajaa nimettömil
      Maailman menoa
      19
      3887
    6. Ostaisitko sinä rempattavan asunnon Italiasta tai jostain muualta ulkomailta, mistä?

      Ella Kanninen on tehnyt Italiassa asuntokaupat. Hän kertoo Instagramissa kierrelleensä viime kesänä Toscanassa katselema
      Asunnot ja asuminen
      19
      2404
    7. Jenni Alexandrova ja Toni Lähde ratkeavat liitoksistaan - Tällainen on uusperhe!

      Radiojuontaja Jenni Alexandrova ja Diili-tuttu Toni Lähde ovat pariskunta, joka elää uusperhearkea. He ovat ostaneet uud
      Suomalaiset julkkikset
      3
      2178
    8. Vähän fiksumpi Nimi kisa ? :=)

      Kirjoita teidän etunimet allekkain. Jos nimissä on joku kirjain sama, poista se. Tee sama tarkistus kaikille kirjaimill
      Ikävä
      25
      1792
    9. Romanttinen ystävänpäivä?

      Millainen olisi hyvä ystävänpäivä hänen kanssaan?
      Ikävä
      73
      1782
    10. Kaisa Juuso eroaa

      Jää välittömästi sairaslomalle. Onko nyt Keskisarjan vuoro?
      Perussuomalaiset
      219
      1488
    Aihe