Identificare dinamică a tipului de date

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 24 ianuarie 2019; verificările necesită 2 modificări .

Identificarea dinamică a tipului de date ( ing.  r un- time tip i nformation , r un - time type type i dentification , RTTI ) este un mecanism în unele limbaje de programare care vă permite să determinați tipul de date al unei variabile sau obiect în timpul execuției.

Implementare

Există multe implementări ale acestui mecanism, dar cele mai comune sunt:

Astfel, operația de determinare a tipului se reduce fie la o căutare în tabel, fie la o căutare de mai mulți octeți până la adresa indicată de pointerul către obiect. Fiecare metodă are avantajele și dezavantajele sale[ specificați ] .

C++

În C++ , operatorii și (definiți în fișierul typeinfo.h ) sunt utilizați pentru identificarea dinamică a tipului [1] , pentru care informațiile de tip în timpul execuției trebuie de obicei adăugate prin opțiunile compilatorului la compilarea modulului. dynamic_casttypeid

Operatorul dynamic_castîncearcă să arunce la tipul specificat cu o verificare. Tipul țintă al operației trebuie să fie un pointer, referință sau tip void*.

Operatorul typeid[2] returnează o referință la o structură type_infocare conține câmpuri care vă permit să obțineți informații despre tip.

Delphi

Compilatorul Delphi stochează în fișierul executabil al programului informații despre toate clasele utilizate în acesta. La crearea oricărui obiect în memorie, înaintea acestuia (la offset -uri negative ) există un antet, care conține și o legătură către structura-descriptorul clasei acestui obiect. Funcțiile încorporate în limbaj funcționează cu aceste informații în mod transparent pentru programator. Operatorul isvă permite să verificați dacă un obiect sau tip este un descendent al unui anumit tip, iar operatorul aseste folosit pentru a turna obiecte sau interfețe de la un tip la altul, fiind omologul dynamic_castîn C++ .

Anteturile obiectelor - de asemenea implicit - sunt folosite pentru gestionarea automată a memoriei .

C#

C # folosește metoda pentru a determina tipul unui obiect în timpul execuției GetType, precum și cuvintele cheie isși as, care sunt omologii pentru typeidși , respectiv, dynamic_castîn C++ .

Java

În Java, tipul unui obiect poate fi obținut folosind o metodă getClass()declarată într-o clasă java.lang.Objectși, prin urmare, implementată de fiecare clasă. Pentru a verifica dacă un obiect aparține unui anumit tip, se folosește operatorul instanceof, un analog dynamic_castdin C++ este operatorul de tip casting, care aruncă o excepție în cazul unei nepotriviri de tip ClassCastException.

La nivel de bytecode, un apel la o metodă de clasă este scris, ca un apel la orice altă metodă, folosind opcode invokevirtual . Opcode-urile instanceof și checkcast sunt utilizate pentru a verifica caracterul de castabilitate al unui obiect la un tip .

Perl

În Perl , tipul unui obiect poate fi determinat folosind funcția blessed(), care face parte din modulul Scalar::Util CPAN. Funcția preia un pointer către un obiect (hash binecuvântat sau echivalent) și returnează un scalar care conține numele clasei.

PHP

Biblioteca standard PHP definește o funcție gettype()care returnează un șir cu numele unui tip încorporat sau un șir objectdacă tipul argumentului transmis funcției este o clasă definită de utilizator.

Vezi și

Note

  1. Identificarea Tipurilor la Runtime (downlink) . Consultat la 18 mai 2010. Arhivat din original la 14 martie 2011. 
  2. Podbelsky V. V. 12.6 Identificare dinamică a tipului (RTTI) // Limbajul C++ / Rec. Dadaev Yu. G. - ed. a IV-a. - M. : Finanţe şi statistică, 2003. - S. 263-280. — 560 p. - ISBN 5-279-02204-7 , UDC 004.438Si (075.8) LBC 32.973.26-018 1ya173.