Class 为强制扩展标记Haxe类?

Class 为强制扩展标记Haxe类?,class,inheritance,haxe,Class,Inheritance,Haxe,类声明是否有一个编译器元,它在扩展类实例之前阻止创建类实例?换句话说-某种程度上与@:finalmeta相反 像这样(代码的最后一行): 实现这一点的一种方法是创建私有类构造函数: class A { private function new() { // ... } } // ... var a = new A(); // Error: Cannot access private constructor 简单地说,不要为a类声明构造函数其他两个答案都是正确的

类声明是否有一个编译器元,它在扩展类实例之前阻止创建类实例?换句话说-某种程度上与
@:final
meta相反

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


实现这一点的一种方法是创建私有类构造函数:

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

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

简单地说,不要为a类声明构造函数

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

  • 这里没有构造函数。需要注意的是,
    A
    根本没有构造函数,
    B
    根本没有调用
    super()
    。除此之外,其他一切都如你所料
  • 下面是一个私有构造函数的示例。您仍然无法实例化
    新的a()
    ,但仍然需要从
    B
    的构造函数调用
    super()
技术细节:

  • 使用某些功能(如成员变量的默认值)将导致
    a
    自动获取隐式构造函数。别担心,这不会影响可构造性,也不会影响是否需要调用
    super()
    。但是要知道它就在那里,如果必要的话,在
    B
    的构造函数前面会有一个隐式的
    super()
    调用。请参阅JS输出以验证这一点
  • 在任何情况下,您都可以在运行时使用
    var A=Type.createInstance(A,[])实例化
    A
    作为编译时类型检查没有限制
相关讨论:

除了私有/无构造函数外,Haxe没有抽象类1(预期不会实例化基类)或抽象方法2(抽象基类上的函数,没有必须由派生类实现的实现)的正式概念,安迪·李(Andy Li)在书中写道,如果你使用了其中的一些概念,就可以强制执行它们。这样的宏可以检测违反这些规则的行为并抛出编译时错误


1.不要混淆,这是一个完全不同的话题。

2.不要与虚拟函数混淆,wikipedia将其视为一个可以覆盖的函数(尽管不同语言的各种文档对这个高负载术语的描述不同)

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

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