Dynamická identifikace typu dat

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 24. ledna 2019; kontroly vyžadují 2 úpravy .

Dynamická identifikace datového typu ( eng. r un- time t ype information , runti t ype i dentification  , RTTI ) je v některých programovacích jazycích mechanismus , který umožňuje určit datový typ proměnné resp . objekt za běhu.

Implementace

Existuje mnoho implementací tohoto mechanismu, ale nejběžnější jsou:

Operace určování typu je tedy redukována buď na vyhledávání v tabulce, nebo na vyhledávání několika bajtů až k adrese, na kterou ukazuje ukazatel na objekt. Každá metoda má své výhody a nevýhody[ specifikovat ] .

C++

V C++ se pro dynamickou identifikaci typu používají operátory a (definované v souboru typeinfo.h ) [1] , pro které je obvykle potřeba při kompilaci modulu přidat informace o typu za běhu pomocí možností kompilátoru. dynamic_casttypeid

Operátor dynamic_castse pokusí přetypovat na zadaný typ pomocí kontroly. Cílový typ operace musí být ukazatel, odkaz nebo typ void*.

Operátor typeid[2] vrací odkaz na strukturu type_info, která obsahuje pole, která umožňují získat informace o typu.

Delphi

Kompilátor Delphi ukládá do spustitelného souboru programu informace o všech třídách v něm použitých. Při vytváření libovolného objektu v paměti je před ním (při záporných offsetech ) hlavička, která také obsahuje odkaz na deskriptor struktury třídy tohoto objektu. Funkce zabudované do jazyka pracují s těmito informacemi pro programátora transparentně. Operátor isvám umožňuje zkontrolovat, zda je objekt nebo typ potomkem určitého typu, a operátor asse používá k přetypování objektů nebo rozhraní z jednoho typu na druhý, což je protějšek dynamic_castv C++ .

Záhlaví objektů - také implicitně - se používají pro automatickou správu paměti .

C#

C # používá metodu k určení typu objektu za běhu GetType, stejně jako klíčových slov isa as, což jsou protějšky pro typeida dynamic_castv C++ .

Java

V Javě lze typ objektu získat pomocí metody getClass()deklarované ve třídě java.lang.Objecta tedy implementované každou třídou. Pro kontrolu, zda objekt patří k určitému typu, se používá operátor instanceof, analogem dynamic_castz C++ je operátor přetypování typu, který vyvolá výjimku v případě neshody typu ClassCastException.

Na úrovni bajtkódu je volání metody třídy zapsáno, stejně jako volání jakékoli jiné metody, pomocí invokevirtual opcode . Operační kódy instanceof a checkcast se používají ke kontrole převoditelnosti objektu na typ .

Perl

V Perlu lze typ objektu určit pomocí funkce blessed(), která je součástí modulu Scalar::Util CPAN. Funkce vezme ukazatel na objekt (požehnaný hash nebo ekvivalent) a vrátí skalár obsahující název třídy.

PHP

Standardní knihovna PHP definuje funkci gettype(), která vrací řetězec s názvem vestavěného typu nebo řetězec object, pokud je typem argumentu předávaného funkci uživatelsky definovaná třída.

Viz také

Poznámky

  1. Identifikace typů za běhu (downlink) . Získáno 18. května 2010. Archivováno z originálu dne 14. března 2011. 
  2. Podbelsky V. V. 12.6 Dynamická identifikace typu (RTTI) // Jazyk C++ / Rec. Dadaev Yu. G. - 4. vyd. - M. : Finance a statistika, 2003. - S. 263-280. — 560 str. - ISBN 5-279-02204-7 , MDT 004.438Si (075.8) LBC 32.973.26-018 1ya173.