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

wil*_*art 2 inheritance haxe

假设我有两个类:

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)的情况下解决此问题?

Mar*_*nol 5

您可以为此使用受约束的参数化类型:

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