Mark Haxe Class强制延伸?

时间:2017-07-23 12:11:45

标签: class inheritance haxe

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

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

class A {
    // ...
}

class B extends A {
    // ...
}

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

3 个答案:

答案 0 :(得分:6)

根本不要为A类声明构造函数

答案 1 :(得分:2)

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

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

<强> 技术性:

  • 使用某些功能(如成员变量的默认值)将导致A自动获取隐式构造函数。不用担心,这不会影响可施工性或是否需要致电super()。但要知道它存在,并且如果有必要,super()构造函数会附加隐式B调用。请参阅JS输出以验证这一点。
  • 在任何情况下,都知道您仍然可以在运行时使用A实例化var a = Type.createInstance(A,[]);,因为编译时类型检查不会限制RTTI

相关讨论:

除了private / no构造函数之外,Haxe还没有正式概念抽象类 1 (基类不会被实例化)或抽象方法 2 (抽象基类上的函数,没有实现必须由派生类实现。)但是,Andy Li写了{{3}如果您使用它们,则强制执行其中一些概念。这样的宏可以检测到违反这些规则并抛出编译时错误。

<子> 1.不要与a macro混淆,Haxe abstracts types是一个完全不同的主题。

<子> 2.不要与虚函数混淆,维基百科describes作为可以被覆盖的函数(尽管各种语言的各种文档描述了这个高负载的术语有所不同。)

答案 2 :(得分:1)

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

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

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