【问题标题】:Pass Class as parameter传递类作为参数
【发布时间】:2013-08-13 19:19:54
【问题描述】:

我正在尝试传递一个类引用并在函数中实例化它。这不起作用:

function foo(myClassRef:Class):Void {
    var myVar = new myClassRef();
}
foo(MyClass);

它给出Unexpected (

这在 Haxe 3 中可行吗?

【问题讨论】:

    标签: haxe


    【解决方案1】:

    Class 有一个Type Parameter,所以如果你要接受一个类作为参数,你需要指定一个类型参数。

    接受任何课程:

    function foo(myClassRef:Class<Dynamic>):Void {
        var myVar = Type.createInstance( myClassRef, [constructorArg1, constructorArg2....] );
        trace( Type.typeof(myVar) );
    }
    

    只接受“sys.db.Object”类或子类:

    function foo(myClassRef:Class<sys.db.Object>):Void {
        var myVar = Type.createInstance( myClassRef, [] );
        trace( Type.typeof(myVar) );
    }
    

    Haxe 3 也允许generic functions:

    @:generic function foo<T:Dynamic>(t:Class<T>) {
        var myVar = new T();
        trace( Type.typeof(myVar) );
    }
    

    在这里你声明函数是泛型的,这意味着对于每个不同的类型参数,将编译不同版本的函数。您接受 Class,其中 T 是类型参数 - 在本例中是动态的,因此它适用于任何类。最后,使用泛型函数让我们编写new T(),这似乎是一种更自然的语法,并且在某些平台上可能会带来性能优势。

    【讨论】:

    • 我只想补充一点,如果将死代码消除设置为完整(-dce full),则如果未在其他任何地方使用该类的构造函数,它将被消除。为了解决这个问题,我们应该在构造函数签名前加上@:keep 元数据like this
    • 我可能错了,但根据文档(haxe 3.2.0)它是Type.createInstance( myClassRef, [args]);,也就是说,参数中没有constructor
    • 那只是我在写一个句子。我也可以写Type.createInstance(myClassRef, [arg1,arg2,arg3])。对不起,我会编辑答案
    【解决方案2】:

    在 Haxe3 和 Haxe2 中是可能的

    function foo<T>(myClassRef:T):Void {
    var myVar = new T();
    

    }

    注意:如果你想让 new T() 工作,Haxe3 类(实现 foo 的地方)必须是 @:generic。

    Haxe2 是另一回事:

    function foo<T>(myClassRef:Class<T>):Void {
    var myVar = Type.createEmptyInstance(Type.getClass(myClassRef));
    

    }

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 1970-01-01
      • 2018-10-20
      • 2013-09-12
      • 2015-03-22
      • 2012-03-15
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多