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 被覆盖的函数(尽管各种文档用于各种语言以不同方式描述这个高负载术语。)
是否有 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 被覆盖的函数(尽管各种文档用于各种语言以不同方式描述这个高负载术语。)