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?
Run-time type information
6
386
Vastaukset
- 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.htmlEi 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.htmlMihin 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
- 2034266
SDP haluaa 40 000 nettomaahanmuuttajaa
SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah1463798Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen
No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat1373261Hienoa! Eduskunta luopui käteisen käytöstä
Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.521638Ikävä sinua mies
Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i191538Mikä tämä henkilö mahtaa touhuta Parkanossa
Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58341490Sulla on avaimet ja keinot
Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi251395Orpo loukkaantui fasismiin viittaavasta sanavalinnasta
Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk271351Kiinnostaa - ei kiinnosta - kiinnostaapas
Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt1171165Martina haluaa Marbellaan
Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust2151063