【问题标题】:Vala: Pass String as ClassVala:将字符串作为类传递
【发布时间】:2013-01-08 13:51:00
【问题描述】:

场景: 我有 x 个课程。让我们说10;每个类执行不同的 UI 功能。当用户加载文件时,该扩展名告诉程序要加载的类名;但它是字符串的形式。

有没有将字符串作为类名传递?有点意思。

 var classname = "Booger";

 var nose = new classname(){ //classname really means "Booger"
 //Do Operation
 }

【问题讨论】:

    标签: linux class ubuntu gtk vala


    【解决方案1】:

    您可以使用var t = Type.from_name(classname); 按名称反映类型,但是,这适用于所有 类型,包括枚举和结构,它可能是Type.INVALID 类型。你可能应该做一些检查,比如t.is_a(typeof(MyParentClass))

    然后您可以使用var obj = Object.new(t); 实例化一个副本。整个事情看起来像:

    var classname = "Booger";
    var t = Type.from_name(classname);
    if (t.is_a(typeof(MyParentClass)))
      return Object.new(t);
    else
      return null;
    

    还值得注意的是,运行时类型名称前面带有命名空间,因此您可能想要使用"MyNs" + classname。您可以签入生成的 C 或执行 typeof(MyClass).name()

    【讨论】:

    • 我试了一下,它显示了正确的 C 链。但它给出了关于作为 GObject 的错误,并且当使用“type.is_classed”测试时它返回错误。这是我得到的错误。 (eStudio:21063): GLib-GObject-CRITICAL **: g_object_new: 断言G_TYPE_IS_OBJECT (object_type)' failed ** (eStudio:21063): CRITICAL **: estudio_docview_source_Register_DocView: assertion self != NULL' 失败 (estudio_docview_source_Register_DocView 是正确的) 分段错误
    • 你的父类是否扩展了 GLib.Object?
    • 是的,它确实扩展了 GLib.Object
    • 无论我做什么,它都认为它是一个字符串而不是一个类。即使它被分配为对象。它被认为是一个字符串。
    • 但它通过了is_a 测试?
    【解决方案2】:

    在获得针对 null 的断言错误方面,我遇到了与 OP 相同的问题。如果您查看 Glib 文档(在 C 中),它提到您必须先通过实际指定类名来注册您的类,然后才能实际使用类名的字符串表示形式。

    换句话说,您必须先使用您的类,然后才能使用 Glib.Type.from_name ("ClassName") 实例化您的类的副本。

    您可以首先通过实例化类实例或获取类的类型信息来使用您的类。

    var type = typeof (MyClass);
    var type_from_string = Type.from_name ("MyClass");
    

    此外,当您使用 Object.new 创建类时,您需要注意两点:

    1) 您需要转换返回值来获取您的特定类或基类。

    var instance_of_my_class = Object.new (type) as MyClass;
    

    2) 你的类的构造函数将不再被调用(我不知道为什么)。你需要在你的类中使用 GObject 风格的构造函数:

    construct {
        pizza = 5;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多