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

420

    Vastaukset 6

    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. Kuollut teini Kajaanissa

      Kuulemma sellaista huhua liikkeessä?
      Kajaani
      6
      1521
    2. Perhoseni (miehelle)

      Miksi et usko, että mun rakkaus sinuun on aitoa ja vilpitöntä? Tai että se oli jo silloin? Miksi ajattelet, ettet ole r
      Ikävä
      167
      1068
    3. Totta on asia. Jeffrey Cohen on jättänyt Sofian.

      Vaimon viesti on paljastanut totuuden.
      Kotimaiset julkkisjuorut
      261
      906
    4. Uskallatko paljastaa

      Millä nimellä löydyn puhelimestasi?
      Ikävä
      69
      799
    5. Halaus juuri sinulle

      Kaikki järjestyy kyllä. Luota vain. ❤️🫶
      Ikävä
      63
      768
    6. Uskaltaisitko

      Tavata kaivattusi tässä tilanteessa?
      Ikävä
      75
      731
    7. Mies, näetkö minut myös

      Seksuaalisena ihmisenä ja naisena? Haluatko minua seksuaalisesti? Vai olenko mielestäsi tyttönen?
      Ikävä
      22
      676
    8. Kuinkahan monen

      Naisen puolisoa olet nainen vikitellyt ja eron aiheuttanut? Toivottavasti karma on ku*sut muroihisi useamman kuin kerran
      Ikävä
      69
      641
    9. Nainen, mitä mieltä olet kodittomista?

      Ja heistä jotka eivät kykene huolehtimaan asioistaan, itsestään eikä terveydestään? Miten heidän kanssaan tulisi toimia?
      Ikävä
      136
      641
    10. Meneekö unohtamis

      Projektisi hyvin??
      Ikävä
      42
      599
    11. Voiko se ikinä toimia

      Voiko meistä ikinä tulla mitään? Näin kauan aikaa on kulunut ja mitään ei tapahdu... En usko, että sinä mietit minua het
      Ikävä
      32
      578
    12. Mitä sä haluat vanhus?

      🤣🤣🤣🤣🤣
      Ikävä
      54
      553
    13. Voin tulla

      Sisustamaan sulle 🤭
      Ikävä
      55
      528
    14. Mies, kumman ottaisit mieluummin

      176 cm vai 154 cm naisen, jos molemmat muuten yhtä viehättäviä? Mikä on oma pituutesi?
      Sinkut
      101
      517
    15. Tekisi mieli vetäistä kunnon jurrit sinun kanssasi

      Ja keskustella asiat, ei tästä tule hevonvttua.
      Ikävä
      42
      514
    16. Eikö olisi mukavaa

      Jakaa arki yhdessä mies. Tämmöisin aatoksin.
      Ikävä
      38
      509
    17. Kauan mökötetään toisillemme?

      Loppuelämäkö? Vai oisko jo pussailutreffit?
      Ikävä
      48
      499
    18. Anteeksi mies

      En jaksa tätä…, en halua, että sinulla on paha mieli tämän takia. Viestiä Sinulle.
      Ikävä
      40
      493
    19. Laittaisit viestin suoraan!!

      Haluaisin...
      Ikävä
      30
      483
    20. Kerro mies tarinasi

      Miksi kaikki meni niinkuin meni? Haluaisin vieläkin ymmärtää. Tuskin saan vastausta häneltä, koska etsin aavikolta juuri
      Ikävä
      20
      478
    Aihe