【问题标题】:Is there a way of getting the names of all subclasses有没有办法获取所有子类的名称
【发布时间】:2021-03-15 11:37:59
【问题描述】:

我想获取基类的所有子类的名称。从那我想@:构建一个枚举,其中每个条目都是一个类的名称。这可能吗?

【问题讨论】:

    标签: haxe


    【解决方案1】:

    这里是代码。宏执行的顺序未定义,如文档中所述。

    [AutoBuildingMacro.hx]

    import haxe.macro.Context;
    import haxe.macro.Expr;
    
    final mapofnames = new Map<String,Array<String>>();
    
    class AutoBuildingMacro {
      public static macro function fromBaseClass(base):Array<Field> {
        var parent = haxe.macro.ExprTools.toString(base);
        var names = mapofnames[parent];
        if ( names == null ) {
          names = new Array<String>();
          mapofnames[parent] = names;
        }
        names.push(Context.getLocalClass().toString());
        trace(mapofnames);
        return null;
      }
    }
    

    [Main.hx]

    import AutoBuildingMacro;
    
    class Main {
      static public function main() {}
    }
    
    @:autoBuild(AutoBuildingMacro.fromBaseClass(Parent))
    class Parent {
    }
    
    class Child1 extends Parent {
    }
    
    class Child2 extends Parent {
    }
    
    class Child3 extends Child2 {
    }
    

    输出:

    AutoBuildingMacro.hx:15: {Parent => [Child2]}

    AutoBuildingMacro.hx:15: {Parent => [Child2,Child3]}

    AutoBuildingMacro.hx:15: {Parent => [Child2,Child3,Child1]}

    【讨论】:

    • 这不是我所需要的,因为它使用 @:autoBuild 来构造数组,这使得无法从数组中构建枚举。我想我仍然可以将它用于我的目的。很抱歉我之前的帖子太不具体了。
    • 没问题。你仍然可以解决这个问题。第一种方法是使用两个构建,第一个只触发自动构建而不生成源代码,第二个是构建枚举和一个源代码。但是,这种方法需要完成服务器正在运行(持久变量)。其他方式更复杂,需要对宏有深入的了解,一旦 Haxe 社区论坛重新启动并运行,将向您指出有关此问题的讨论。
    【解决方案2】:

    【讨论】:

    • 谢谢,但我已经知道构建宏,我之所以提到它们是因为它需要在那个阶段可用。重要的部分是“获取所有子类的名称”。
    • 抱歉,您的术语让我感到困惑。在上面的链接中有一个 Base->Main 类继承,例如主类扩展基类。换句话说,Main 类是 Base 类的子类。但是,您可能想知道 Main 派生自哪个类?我不认为这是可能的,虽然 Haxe 不支持多重继承(上次我检查 Haxe,一年多以前)
    • 对不起,如果我解释得不好。我会看看我能不能解释得更好。假设我们有一个“父母”类。父级由“Child1”和“Child2”类扩展。 Child2 由 Child3 扩展。我想对 Parent 应用一个函数,它给我一个看起来像这样的数组 ["Child1", "Child2", "Child3"]
    • 您问是否可能。是的。现在看来您是在要求源代码。请在提问时具体说明。
    【解决方案3】:

    我编写了一个名为 compiletime 的库,它具有此功能:

    // Returns a list of all the classes that inherit MySuperClass, no matter what package
    CompileTime.getAllClasses(MySuperClass);
    

    我使用的approach 解决了构建顺序问题,方法是使用 Context.onGenerate 挂钩在编译结束时(而不是在编译每个类时)构建匹配类的数组,并将该数组添加到“元数据” ”,仍然可以在“onGenerate”步骤中修改。然后,我在单独的运行时类中使用此元数据来获取运行时的类数组。

    【讨论】:

    • 没错,就是高级宏的用法:onAfterTyping、onGenerate、onAfterGenerate 都很强大。感谢您编写这个库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2013-01-08
    • 2022-01-26
    • 2011-05-16
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多