Downcasting - Downcasting
![]() | Tento článek obsahuje seznam obecných Reference, ale zůstává z velké části neověřený, protože postrádá dostatečné odpovídající vložené citace.Srpna 2008) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v třídní programování, vylidňování nebo upřesnění typu je akt odlévání odkaz na základní třídu na jednu z jejích odvozených tříd.
V mnoha programovací jazyky, je možné provést kontrolu introspekce typu k určení, zda je typ odkazovaného objektu skutečně ten, na který se vrhá, nebo odvozený typ, a tedy vydat chybu, pokud tomu tak není.
Jinými slovy, když proměnná základní třídy (mateřská třída ) má hodnotu odvozené třídy (dětská třída ), je možné downcasting.
Příklady
Jáva
veřejnost třída Ovoce{} // nadřazená třídaveřejnost třída Jablko rozšiřuje Ovoce{} // podřízená třídaveřejnost statický prázdnota hlavní(Tětiva args[]) { // Toto je implicitní upcast: Ovoce rodič = Nový Jablko(); // Toto je downcast. Zde to funguje, protože proměnná `parent` je // držení instance Apple: Jablko dítě = (Jablko)rodič;}
C ++
// Nadřazená třída:třída Ovoce { veřejnost: // Musí být polymorfní, aby bylo možné použít dynamické obsazení kontrolované za běhu. virtuální ~Ovoce() = výchozí;};// Dětská třída:třída Jablko : veřejnost Ovoce {};int hlavní(int argc, konst char** argv) { // Toto je implicitní upcast: Ovoce* rodič = Nový Jablko(); // Toto je downcast. Zde to funguje, protože proměnná `parent` je // držení instance Apple: Jablko* dítě = dynamic_cast<Jablko*>(rodič); vymazat rodič;}
Použití
Downcasting je užitečné, když je znám typ hodnoty odkazované nadřazenou proměnnou a často se používá při předávání hodnoty jako parametru. V níže uvedeném příkladu metoda objectToString přebírá Object parametr, o kterém se předpokládá, že je typu String.
veřejnost statický Tětiva objectToString(Objekt myObject) { // Funguje to pouze v případě, že hodnota aktuálně zadržovaného objektu myObject je řetězec. vrátit se (Tětiva)myObject;}veřejnost statický prázdnota hlavní(Tětiva args[]) { // To bude fungovat, protože jsme prošli v řetězci, takže myObject má hodnotu řetězce. Tětiva výsledek = objectToString(„My String“); Objekt iFail = Nový Objekt(); // To se nezdaří, protože jsme předali Object, který nemá hodnotu String. výsledek = objectToString(iFail);}
V tomto přístupu downcasting brání kompilátoru detekovat možnou chybu a místo toho způsobí chybu za běhu. Přenesení myObject na String ('(String) myObject') nebylo možné v době kompilace, protože existují časy, kdy myObject je String typ, takže pouze za běhu můžeme zjistit, zda je předaný parametr logický. I když bychom mohli také převést myObject na řetězec v kompilaci pomocí univerzálního java.lang.Object.toString (), hrozilo by to volání výchozí implementace toString (), kde to bylo neužitečné nebo nejisté, a zpracování výjimek tomu nemohlo zabránit .
V C ++ je prováděna kontrola typu run-time prostřednictvím dynamic_cast. Downcasting v době kompilace implementuje static_cast, ale tato operace neprovádí žádnou kontrolu typu. Pokud se použije nesprávně, mohlo by to způsobit nedefinované chování.
Kritika
Některé jazyky, například OCaml, úplně zakázat downcasting.[1]
Populárním příkladem špatně uvažovaného designu jsou kontejnery špičkové typy,[Citace je zapotřebí ] jako Jáva kontejnery dříve Generika Java byly zavedeny, což vyžaduje downcasting obsažených objektů, aby je bylo možné znovu použít.
Viz také
Reference
- ^ Vouillon, Jérôme; Rémy, Didier; Garrigue, Jacques (12. září 2013). "Objekty v OCaml". Vydání systému OCaml 4.01: Dokumentace a uživatelská příručka.
externí odkazy
- Downcasting je vůně kódu Jeremy D. Miller
- Skandální tragédie Jimmy Bogard
- Upřednostňujte polymorfismus před instance a downcasting Bill Venners
- Downcasting v C # Scott Lysle
- Několik technik downcastingu
- Upcasting, downcasting podle Sinipull