fbpx
Wikipedia

Downcasting

In class-based programming, downcasting, or type refinement, is the act of casting a base or parent class reference, to a more restricted derived class reference.[1] This is only allowable if the object is already an instance of the derived class, and so this conversion is inherently fallible.

In many environments, type introspection can be used to obtain the type of an object instance at runtime, and then use this result to explicitly evaluate its type compatibility with another type. The possible results of comparing polymorphic types—besides them being equivalent (identical), or unrelated (incompatible)—include two additional cases: namely, where the first type is derived from the second, and then the same thing but swapped the other way around (see: Subtyping § Subsumption).

With this information, a program can test, before performing an operation such as storing an object into a typed variable, whether that operation is type safe, or whether it would result in an error. If the type of the runtime instance is derived from (a child of) the type of the target variable (therefore, the parent), downcasting is possible.

Some languages, such as OCaml, disallow downcasting.[2]

Examples edit

Java edit

public class Fruit{} // parent class public class Apple extends Fruit{} // child class public static void main(String[] args) {  // The following is an implicit upcast:  Fruit parent = new Apple();  // The following is a downcast. Here, it works since the variable `parent` is  // holding an instance of Apple:  Apple child = (Apple)parent; } 

C++ edit

// Parent class: class Fruit {  public:  // Must be polymorphic to use runtime-checked dynamic-cast.  virtual ~Fruit() = default; }; // Child class: class Apple : public Fruit {}; int main(int argc, const char** argv) {  // The following is an implicit upcast:  Fruit* parent = new Apple();  // The following is a downcast. Here, it works since the variable `parent` is  // holding an instance of Apple:  Apple* child = dynamic_cast<Apple*>(parent); } 

Uses edit

Downcasting is useful when the type of the value referenced by the Parent variable is known and often is used when passing a value as a parameter. In the below example, the method objectToString takes an Object parameter which is assumed to be of type String.

public static String objectToString(Object myObject) {  // This will only work when the myObject currently holding value is string.  return (String)myObject; } public static void main(String[] args) {  // This will work since we passed in String, so myObject has value of String.  String result = objectToString("My String");  Object iFail = new Object();  // This will fail since we passed in Object which does not have value of String.  result = objectToString(iFail); } 

In this approach, downcasting prevents the compiler from detecting a possible error and instead causes a run-time error. Downcasting myObject to String ('(String)myObject') was not possible at compile time because there are times that myObject is String type, so only at run time can we figure out whether the parameter passed in is logical. While we could also convert myObject to a compile-time String using the universal java.lang.Object.toString(), this would risk calling the default implementation of toString() where it was unhelpful or insecure, and exception handling could not prevent this.

In C++, run-time type checking is implemented through dynamic_cast. Compile-time downcasting is implemented by static_cast, but this operation performs no type check. If it is used improperly, it could produce undefined behavior.

Considerations edit

A popular example of a badly considered design is containers of top types,[citation needed] like the Java containers before Java generics were introduced, which requires downcasting of the contained objects so that they can be used again.

See also edit

References edit

  1. ^ TylerMSFT (2021-08-03). "How to: Use safe_cast in C++/CLI". learn.microsoft.com. Retrieved 2023-12-01.
  2. ^ Vouillon, Jérôme; Rémy, Didier; Garrigue, Jacques (September 12, 2013). "Objects in OCaml". The OCaml system release 4.01 : Documentation and user's manual.

External links edit

  • Downcasting is a Code Smell by Jeremy D. Miller
  • A downcasting tragedy by Jimmy Bogard
  • Prefer polymorphism over instanceof and downcasting by Bill Venners
  • Downcasting in C# by Scott Lysle
  • Multiple downcasting techniques
  • Upcasting, downcasting by Sinipull

downcasting, downcast, redirects, here, downcast, coal, mining, term, glossary, coal, mining, terminology, this, article, includes, list, general, references, lacks, sufficient, corresponding, inline, citations, please, help, improve, this, article, introducin. Downcast redirects here For the app see Downcast app For the coal mining term see Glossary of coal mining terminology This article includes a list of general references but it lacks sufficient corresponding inline citations Please help to improve this article by introducing more precise citations August 2008 Learn how and when to remove this template message In class based programming downcasting or type refinement is the act of casting a base or parent class reference to a more restricted derived class reference 1 This is only allowable if the object is already an instance of the derived class and so this conversion is inherently fallible In many environments type introspection can be used to obtain the type of an object instance at runtime and then use this result to explicitly evaluate its type compatibility with another type The possible results of comparing polymorphic types besides them being equivalent identical or unrelated incompatible include two additional cases namely where the first type is derived from the second and then the same thing but swapped the other way around see Subtyping Subsumption With this information a program can test before performing an operation such as storing an object into a typed variable whether that operation is type safe or whether it would result in an error If the type of the runtime instance is derived from a child of the type of the target variable therefore the parent downcasting is possible Some languages such as OCaml disallow downcasting 2 Contents 1 Examples 1 1 Java 1 2 C 2 Uses 3 Considerations 4 See also 5 References 6 External linksExamples editJava edit public class Fruit parent class public class Apple extends Fruit child class public static void main String args The following is an implicit upcast Fruit parent new Apple The following is a downcast Here it works since the variable parent is holding an instance of Apple Apple child Apple parent C edit Parent class class Fruit public Must be polymorphic to use runtime checked dynamic cast virtual Fruit default Child class class Apple public Fruit int main int argc const char argv The following is an implicit upcast Fruit parent new Apple The following is a downcast Here it works since the variable parent is holding an instance of Apple Apple child dynamic cast lt Apple gt parent Uses editDowncasting is useful when the type of the value referenced by the Parent variable is known and often is used when passing a value as a parameter In the below example the method objectToString takes an Object parameter which is assumed to be of type String public static String objectToString Object myObject This will only work when the myObject currently holding value is string return String myObject public static void main String args This will work since we passed in String so myObject has value of String String result objectToString My String Object iFail new Object This will fail since we passed in Object which does not have value of String result objectToString iFail In this approach downcasting prevents the compiler from detecting a possible error and instead causes a run time error Downcasting myObject to String String myObject was not possible at compile time because there are times that myObject is String type so only at run time can we figure out whether the parameter passed in is logical While we could also convert myObject to a compile time String using the universal java lang Object toString this would risk calling the default implementation of toString where it was unhelpful or insecure and exception handling could not prevent this In C run time type checking is implemented through dynamic cast Compile time downcasting is implemented by static cast but this operation performs no type check If it is used improperly it could produce undefined behavior Considerations editA popular example of a badly considered design is containers of top types citation needed like the Java containers before Java generics were introduced which requires downcasting of the contained objects so that they can be used again See also editSubtype polymorphismReferences edit TylerMSFT 2021 08 03 How to Use safe cast in C CLI learn microsoft com Retrieved 2023 12 01 Vouillon Jerome Remy Didier Garrigue Jacques September 12 2013 Objects in OCaml The OCaml system release 4 01 Documentation and user s manual External links editDowncasting is a Code Smell by Jeremy D Miller A downcasting tragedy by Jimmy Bogard Prefer polymorphism over instanceof and downcasting by Bill Venners Downcasting in C by Scott Lysle Multiple downcasting techniques Upcasting downcasting by Sinipull Retrieved from https en wikipedia org w index php title Downcasting amp oldid 1210840000, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.