Mark Haxe Class 强制延长?

Mark Haxe Class for forced extend?

是否有 Class 声明的编译器元数据, 阻止在扩展它之前创建 Class 实例 ?换句话说 - 某种与 @:final meta.

相反的东西

像这样(最后一行代码):

class A {
    // ...
}

class B extends A {
    // ...
}

// ...
var b = new B(); // OK
var a = new A(); // induce compiler-error

实现此目的的一种方法是创建私有 Class 构造函数:

class A {
    private function new() {
        // ...
    }
}

// ...
var a = new A(); // Error: Cannot access private constructor

根本不为 class A

声明构造函数

其他两个答案都是正确的(没有构造函数或私有构造函数),但还有一些您可能感兴趣的细节:

  • 这里 an example 没有构造函数。值得注意的是 A 根本没有构造函数,而 B 根本不调用 super()。除此之外,其他一切都如您所愿。
  • 这是私有构造函数的 an example。您仍然无法实例化 new A(),但您仍然需要从 B 的构造函数中调用 super()

技术:

  • 使用某些功能(如成员变量的默认值)将导致 A 自动获得隐式构造函数。别担心,这不会影响可构造性或是否需要调用 super()。但是要知道它在那里,并且如果需要的话,隐式的 super() 调用会被添加到 B 的构造函数之前。查看 JS 输出以验证这一点。
  • 无论如何,要知道您仍然可以在运行时使用 var a = Type.createInstance(A,[]); 实例化 A,因为编译时类型检查不限制 RTTI.

相关讨论:

除了private/no构造器,Haxe没有正式的抽象概念classes1(基 classes 预计不会被实例化)或 抽象方法2(抽象基 classes 上的函数没有 必须 由派生的 class 实现的实现。)但是,Andy Li 写了 a macro 来强制执行其中的一些概念,如果你使用它们的话。这样的宏可以检测违反这些规则并抛出编译时错误。


1. 不要与 Haxe abstracts types 混淆,它们是完全不同的主题。

2. 不要与 virtual functions 混淆,维基百科 describes 作为一个 can 被覆盖的函数(尽管各种文档用于各种语言以不同方式描述这个高负载术语。)