As the title says, I am trying to access the static properties of a class passed into a function. This is a rough example of what I have done:
class Test {
static function main() {
testFunction(ChildClass1);
}
static function testFunction(c:Class<Dynamic>) {
trace(c.staticVariable);
}
}
class ParentClass {}
class ChildClass1 extends ParentClass {
public static var staticVariable = "child1";
}
class ChildClass2 extends ParentClass {
public static var staticVariable = "child2";
}
The problem is, the compiler throws me a compilation error:
Test.hx:7: characters 14-30 : Class<Dynamic> has no field staticVariable
So turns out the problem is that the compiler doesn’t recognise the c parameter of testFunction as a type of ParentClass. I’ve tried Class<ParentClass> and ParentClass<Dynamic> but they didn’t work. I tried googling, without success. Does anyone know how to solve this?
You can’t exactly pass objects through a function to get their static variable.
You’ll have to initialize the object to access it’s static variable if you’re going to access it through inheritance, here’s a better practice OOP example:
using Test;
class Test {
static var exm:ParentClass;
static function main() {
testFunction(new ParentClass());
testFunction(new ChildClass1());
}
public static function testFunction(c:ParentClass) {
trace(c.getStaticVariable());
}
}
class ParentClass {
public static var staticVariable:String = "parent";
public function new() {}
public function getStaticVariable():String
{
return ParentClass.staticVariable;
}
}
class ChildClass1 extends ParentClass {
public static var staticVariable:String = "child1";
override public function getStaticVariable():String
{
return ChildClass1.staticVariable;
}
}
class ChildClass2 extends ParentClass {
public static var staticVariable:String = "child2";
override public function getStaticVariable():String
{
return ChildClass1.staticVariable;
}
}
You could also use Haxe Reflections but most I wouldn’t recommend because It could cause problems when targeting different targets. it but here you go:
class Test {
static function main() {
testFunction(ChildClass1);
}
static function testFunction(c:Class<ParentClass>) {
trace(Reflect.field(c, "staticVariable"));
}
}
class ParentClass {}
class ChildClass1 extends ParentClass {
public static var staticVariable = "child1";
}
class ChildClass2 extends ParentClass {
public static var staticVariable = "child2";
}
Thanks for the answer! I’ll see if I can alter my code so that it takes in a class instance instead of the class itself. If it fails then I’ll take a look at reflections. Thanks for your help! I really appreciate it.