Haxe - 如何将变量声明为父类或子类的实例

时间:2015-10-26 15:36:32

标签: inheritance haxe

假设我有两个类:

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.playerManagerplayerManager:PlayerManagerParent的类型,它没有定义someMethod()而编译器/ typechecker给我错误。

如何在不声明父类中的someMethod()或将playerManager类型设置为Dynamic的情况下解决此问题(这可能是一个选项,但我不能在{}中的可迭代字段进行迭代{1}},例如)?

2 个答案:

答案 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.html

     

Protip:您甚至可以将其标记为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();
     }
}