CrxOop CrxOop: Bringing Object Oriented Programming, and Proper Prototype Based Programming, To Javascript
The aim of the library documented below is to provide developers with a solution to allow development using interfaces and classes as they are known in other object oriented programming (OOP) languages such as C++, C#, Java and PHP. Further more, V1.4 introduces structures, a generalization of the concept of prototypal inheritance, known here as POBP.
Subject
Body*
Email
SUBMIT CLOSE
Menu

3.6.3 CAST

CAST is a function. It allows you to upcast or downcast an instance to other classes of the extension chain. 'CAST' must never be passed to functions as parameters or from functions as returns, and there can never be a need to do so. Misuse of this keyword can lead to fatal errors.

JS (Tree)
crx_registerClass("ExampleClass1",
{
   PUBLIC:
   {
      VARS:
      {
         "publicVar": "I am ExampleClass1's publicVar"
      },
      FUNCTIONS:
      {
         "publicFunction": function(pExampleClass2)
         {
            //   Casting to access pExampleClass2's
            //      ExampleClass1::publicVar variable
            console.log(pExampleClass2.CAST("ExampleClass1").publicVar);


            //   But casting to access ExampleClass1::privateVar
            //      will not work.
            console.log(pExampleClass2.CAST("ExampleClass1").privateVar);
            //   However, because we are in the same class that we are
            //      casting to, we can use 'O', which can be used
            //      to access publics and privates.
            console.log(this.O(pExampleClass2).privateVar);
         }
      }
   },
   PRIVATE:
   {
      VARS:
      {
         "privateVar": "privateVar"
      }
   }
});
crx_registerClass("ExampleClass2",
{
   EXTENDS: "ExampleClass1",
   PUBLIC:
   {
      VARS:
      {
         "publicVar": "I am ExampleClass2's publicVar"
      },
      FUNCTIONS:
      {
         "publicFunction": function()
         {
            console.log(this.publicVar);

            // And remember CAST is a class keyword, hence it is
            //      found on 'this' as well.
            console.log(this.CAST("ExampleClass1").publicVar);
         }
      }
   }
});

var instance = crx_new("ExampleClass2");

//   Casting to call ExampleClass1::publicFunction, but remember
//      this will not work for virtual functions.
instance.CAST("ExampleClass1").publicFunction(instance);

console.log("------------");

instance.publicFunction();
I am ExampleClass1's publicVar
undefined
privateVar
------------
I am ExampleClass2's publicVar
I am ExampleClass1's publicVar
JS (Verbose)
crx_registerClass("ExampleClass1",
{
   "VERBOSE": 1,
   "public var publicVar": "I am ExampleClass1's publicVar",
   "public function publicFunction": function(pExampleClass2)
   {
      //   Casting to access pExampleClass2's
      //      ExampleClass1::publicVar variable
      console.log(pExampleClass2.CAST("ExampleClass1").publicVar);


      //   But casting to access ExampleClass1::privateVar
      //      will not work.
      console.log(pExampleClass2.CAST("ExampleClass1").privateVar);
      //   However, because we are in the same class that we are
      //      casting to, we can use 'O', which can be used
      //      to access publics and privates.
      console.log(this.O(pExampleClass2).privateVar);
   },
   "private var privateVar": "privateVar"
});
crx_registerClass("ExampleClass2",
{
   "VERBOSE": 1,
   "extends": "ExampleClass1",
   "public var publicVar": "I am ExampleClass2's publicVar",
   "public function publicFunction": function()
   {
      console.log(this.publicVar);

      // And remember CAST is a class keyword, hence it is
      //      found on 'this' as well.
      console.log(this.CAST("ExampleClass1").publicVar);
   }
});

var instance = crx_new("ExampleClass2");

//   Casting to call ExampleClass1::publicFunction, but remember
//      this will not work for virtual functions.
instance.CAST("ExampleClass1").publicFunction(instance);

console.log("------------");

instance.publicFunction();
I am ExampleClass1's publicVar
undefined
privateVar
------------
I am ExampleClass2's publicVar
I am ExampleClass1's publicVar