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

标签 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() 并且编译器/类型检查器给我错误。

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

最佳答案

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

class PlayerManagerParent {
   public function new(){
   }  
}

class GameManagerParent<T:PlayerManagerParent> {
   public var playerManager:T;

   public function new(){
   }  
}

有了这个,你可以这样扩展:

class PlayerManagerChild extends PlayerManagerParent {
   public function new(){
      super();
   }  

   public function someMethod(){
   }
}

class GameManagerChild extends GameManagerParent<PlayerManagerChild> {

   public function new(){
      super();
      this.playerManager = new PlayerManagerChild();
   }  
}

它允许您这样做:

var child = new GameManagerChild();
child.playerManager.someMethod();

实例:
http://try.haxe.org/#21bfC

See also:
http://haxe.org/manual/type-system-type-parameters.html

Protip: You could even mark it as @:generic, which might be gain extra performance at some platforms: http://haxe.org/manual/type-system-generic.html

关于inheritance - Haxe - 如何将变量声明为父类或子类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33349718/

相关文章:

java - java中一个类的内存分配?

c# - 如果其中一个接口(interface)继承自其余接口(interface),为什么 C# 中的集合类(如 ArrayList)继承自多个接口(interface)?

c# - 由于泛型类型导致不必要的长类名

ubuntu - haxe 找不到 haxelib 安装的 csv 库

actionscript-3 - 用于 Nape 中船舶和子弹的 sensorGroup 和 sensorMask 组合

javascript - 使用不同名称别名或以其他方式合并两个相同的对象原型(prototype)

css - <a> 标签何时不继承父标签的颜色属性?

html - 方法比较在 Neko 中失败但适用于 JavaScript

flash - Flash中的透视

installation - 从二进制文件安装 Haxe