Pointer to a type? (not a type instance...)
BlitzMax Forums/BlitzMax Programming/Pointer to a type? (not a type instance...)
| ||
I want to pass a pointer of a type as a parameter to a function so that I may access the type's functions from within the called function. For example, I can have: Type myType Global x:int Function GetUniqueNumber:int() x=x+1 return x End Function End Type 'Call the myType.GetUniqueNumber() function thisVar:int = myType.Add() That is simple enough.. Now, I want to make a function that can take any type, and execute a certain function within that type... For example: (pseudo) type myType global x:int function GetUniqueNumber:int() x=x+1 return x end function end type type otherType global x:int function GetUniqueNumber:int() x=x+1 return x end function end type Function callTypeFunction(typePointer var) return typePointer.GetUniqueNumber() End Function if(this) something=CallTypeFunction(myType) else something=CallTypeFunction(otherType) endif I know, this is a terrible example, and given this example, there would be much better ways to do this. But it is just to illustrate the concept. Can this be done? |
| ||
Not possible without a bunch of black magic. Reflection can give you access to methods and fields of an instance, but not functions of a type. The easiest way to do this without some sort of hackery is to pass the pointer to the function (though at that point you should just look for a better way to do what you're trying to do.) |
| ||
you already probably know how to do this but just in case, this can be an alternative(the only way with out the black magic as posted above):Type base Function getUniqueNumber:Int()Abstract End Type Type myType Extends base Global x:Int Function GetUniqueNumber:Int() x=x+1 Return x End Function End Type Type otherType Extends base Global x:Int Function GetUniqueNumber:Int() x=x+1 Return x End Function End Type Function callTypeFunction:Int(typePointer:base) Return typePointer.GetUniqueNumber() End Function Local type1:myType = New myType Local type2:otherType = New otherType If(this) something:Int=CallTypeFunction(type1) Else something:Int=CallTypeFunction(type2) EndIf alternatively you can do functions but not types. |
| ||
Whatever it is you're trying to do, there's probably a better way. Functions in types are no different to functions outside of types. It's just a way of organising your code so functions related to a particular type are bundled together. There's nothing special about them that relates them to a particular type, unlike a method. |
| ||
Jesse - thanks! While I knew you could extend types and have abstract methods, I didn't know that an instance of a type could be considered also a type of the derived type! (I.e. i didn't know that and instance of MyType could be passed as a parameter as both the MyType type and the Base type) |
| ||
You are welcome. I guess you finally got the principal of Polymorphism. ;) |