如何将一个对象更改为另一个对象?

时间:2015-06-30 20:06:54

标签: actionscript-3

这主要是关于代码设计的问题。你在这里看到的是原始代码的一个非常简洁的版本。

代码的一个例子是:

player.rest();

这会让玩家入睡。

我有其他方法,例如步行,跑步,谈话等等都很有效。问题是多态。它将玩家从人类对象更改为另一个对象。我想出的解决方案就是:

class main
  {
      var human:Human = new Human;
      var alien:Alien = new Alien;
      var cow:Cow = new Cow;
      var player = human;

      enterframe loop{
       //other code 
       if (player does something)
       player.polymorph = "alien";

       switch (player.polymorph)
       {
         case "alien":
         player = alien;
         break;
         case "cow":
         player = cow;
         break;
         //etc
       }
       player.update();
     }
  }

我想要一些看起来像这样的东西:

  class main 
    {
      var human:Human = new Human;
      var alien:Alien = new Alien;
      var player = human;

      enterframe loop
      {
       player.polymorph(alien);
      }
    }

我知道我的原始解决方案是错误的方式,因为它鼓励意大利面条代码。我怎么能这样做呢?我不介意整个改写,但需要一个例子来帮助我朝着正确的方向前进。我希望这是有道理的,并感谢你的帮助。

如果第二个可以工作,那么多态函数会是什么样的?

我想过制作一个名为“玩家”的课程并改变那些扩展的课程,但据我所知,这是无法做到的?另外,我想将角色更改为游戏中已有的内容,而不是新对象。

1 个答案:

答案 0 :(得分:0)

您的问题的一个解决方案是使用单个类,在本例中为您的Player类,以及finite state machine。你有一个Player类,可以设置为不同的状态,例如HUMAN,ALIEN,COW等。当发生多态事件时,你可以通过调用initState()方法来更新Player的状态,并处理逻辑作为一个人类,外星人,牛,因此无论以何种方式更新你的玩家。

假设玩家有update()方法,它可能包含以下内容:

switch (state) {
    case ALIEN: 
       // do alien stuff
    case COW:
       // do cow stuff
    case HUMAN:
       // do human stuff
}

接下来,您的Player类可以使用一个以状态作为参数的polyMorph方法,而不是在switch语句中处理各种多态信号状态:

public function polymorph(newState:Int) {
    state = newState;
    initState(state); // You could even just call the initState method instead, and completely omit the polymorph method
}

在这里使用有限状态机将消除对大量对象的需求。