假设我有两个类:
class PlayerManagerParent {
public function new(){
}
}
class GameManagerParent {
public var playerManager:PlayerManagerParent();
public function new(){
}
}
然后我将其子类化为
class PlayerManagerChild extends PlayerManagerParent {
public function new(){
super();
}
public function someMethod(){
}
}
class GameManagerChild extends GameManagerParent {
public function new(){
super();
this.playerManager = new PlayerManagerChild();
}
}
然后我制作了GameManagerChild
的实例并希望访问someMethod()
:
var gameManager:GameManagerChild = new GameManagerChild();
gameManager.playerManager.someMethod();
我当然不能这样做,因为gameManager.playerManager
是playerManager:PlayerManagerParent
的类型,它没有定义someMethod()
而编译器/ typechecker给我错误。
如何在不声明父类中的someMethod()
或将playerManager
类型设置为Dynamic
的情况下解决此问题(这可能是一个选项,但我不能在{}中的可迭代字段进行迭代{1}},例如)?
答案 0 :(得分:4)
您可以使用约束参数化类型:
wdHorizontalPositionRelativeToPage
有了这个,你可以像这样扩展:
wdVerticalPositionRelativeToPage
允许您这样做:
class PlayerManagerParent {
public function new(){
}
}
class GameManagerParent<T:PlayerManagerParent> {
public var playerManager:T;
public function new(){
}
}
直播示例:
http://try.haxe.org/#21bfC
另见:
http://haxe.org/manual/type-system-type-parameters.htmlProtip:您甚至可以将其标记为
class PlayerManagerChild extends PlayerManagerParent { public function new(){ super(); } public function someMethod(){ } } class GameManagerChild extends GameManagerParent<PlayerManagerChild> { public function new(){ super(); this.playerManager = new PlayerManagerChild(); } }
,这可能会在某些平台上获得额外的性能: http://haxe.org/manual/type-system-generic.html
答案 1 :(得分:3)
您应该使用类型参数,例如:
class GameManagerParent<PM:PlayerManagerParent> {
public var playerManager : PM;
}
class GameManagerChild
extends GameManagerParent<PlayerManagerChild> {
public function new() {
playerManager = new PlayerManagerChild();
}
}