假设我有两个类:
class PlayerManagerParent {
public function new(){
}
}
class GameManagerParent {
public var playerManager:PlayerManagerParent();
public function new(){
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将其子类为
class PlayerManagerChild extends PlayerManagerParent {
public function new(){
super();
}
public function someMethod(){
}
}
class GameManagerChild extends GameManagerParent {
public function new(){
super();
this.playerManager = new PlayerManagerChild();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建实例GameManagerChild并想要访问someMethod():
var gameManager:GameManagerChild = new GameManagerChild();
gameManager.playerManager.someMethod();
Run Code Online (Sandbox Code Playgroud)
我当然不能这样做,因为没有定义的gameManager.playerManager类型和编译器/类型检查器给了我错误。playerManager:PlayerManagerParentsomeMethod()
如何someMethod()在不声明父类或将playerManager类型设置为Dynamic(这将是一个选项,但随后我无法迭代 中的可迭代字段playerManager)的情况下解决此问题?
您可以为此使用受约束的参数化类型:
class PlayerManagerParent {
public function new(){
}
}
class GameManagerParent<T:PlayerManagerParent> {
public var playerManager:T;
public function new(){
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,你可以像这样扩展:
class PlayerManagerChild extends PlayerManagerParent {
public function new(){
super();
}
public function someMethod(){
}
}
class GameManagerChild extends GameManagerParent<PlayerManagerChild> {
public function new(){
super();
this.playerManager = new PlayerManagerChild();
}
}
Run Code Online (Sandbox Code Playgroud)
这允许你这样做:
var child = new GameManagerChild();
child.playerManager.someMethod();
Run Code Online (Sandbox Code Playgroud)
现场示例:http :
//try.haxe.org/#21bfC
另见:http :
//haxe.org/manual/type-system-type-parameters.html提示:您甚至可以将其标记为
@:generic,这可能会在某些平台上获得额外的性能:http : //haxe.org/manual/type-system-generic.html