【问题标题】:Haxe - How to declare variable to be either instance of parent or child classHaxe - 如何将变量声明为父类或子类的实例
【发布时间】:2015-10-26 15:36:32
【问题描述】:

假设我有两个类:

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 中的可迭代字段,例如) ?

【问题讨论】:

    标签: inheritance haxe


    【解决方案1】:

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

    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

    另请参阅:
    http://haxe.org/manual/type-system-type-parameters.html

    Protip:您甚至可以将其标记为@:generic,这可能会在某些平台上获得额外的性能: http://haxe.org/manual/type-system-generic.html

    【讨论】:

    • 嗯,你的记录更多:)
    • 嗯,这部分解决了我的问题,但是当我尝试在您的示例测试类中执行此操作时:var child2:GameManagerParent&lt;PlayerManagerParent&gt; = child;,它不起作用。
    • 没错,但我认为这也是意料之中的,因为Parent没有这个功能,对吧?
    【解决方案2】:

    您可能应该使用类型参数,例如:

    class GameManagerParent<PM:PlayerManagerParent> {
         public var playerManager : PM;
    }
    
    class GameManagerChild 
    extends GameManagerParent<PlayerManagerChild> {
         public function new() {
             playerManager = new PlayerManagerChild();
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多