是否有类声明的编译器元,在扩展之前阻止创建类实例?换句话说 - 某种与@:final
元的相反。
像这样(最后一行代码):
class A {
// ...
}
class B extends A {
// ...
}
// ...
var b = new B(); // OK
var a = new A(); // induce compiler-error
答案 0 :(得分:6)
根本不要为A类声明构造函数
答案 1 :(得分:2)
其他答案都是正确的(没有构造函数或私有构造函数),但还有一些您可能感兴趣的细节:
A
根本没有构造函数,而B
根本就没有调用super()
。除此之外,其他一切都按照您的预期进行。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