使用在AS3中接受不同类型参数的方法创建子类

时间:2012-06-15 18:38:34

标签: actionscript-3 flash oop polymorphism abstract-class

我有一个类Pawn,它是游戏中所有“角色”的基类,具有健康等属性,可以移动,死亡或说话等。扩展这个类的一类是“男孩”类。 “男孩”类是这个游戏中玩家控制的角色。

为了控制字符“状态”,创建了状态类。它们具有onEnterState,onStateTick和onLeaveState等方法。状态可以用于表示蹲伏,行走,跳跃,并且将发送诸如“keyPressed”“< - ”之类的消息以在其选择时处理或忽略。

我的问题是我的基础“州”类的方法如下:

function onEnter ( pawn:Pawn ) :void;
function onLeave ( pawn:Pawn ) :void;       
function onGameTick ( pawn:Pawn ) :void;        
function onAnimEnd ( pawn:Pawn ) :void;

正如您所看到的,这实际上是一个接口,但我确实首先尝试了基类,直到很明显ActionScript3不喜欢抽象类。

所以无论如何,一个类“BoyJumpState”显然需要扩展/实现这个类/接口,以确保公共方法可以进行交互,但是这一点受到ActionScript不允许我扩展的阻碍,说,这个:

public override function onEnter ( boy:Boy) :void { trace("Hey"); }

这是被拒绝的编译时间,因为它与蓝图不匹配(即它不接受Pawn)。但是,我需要它接受一个Boy,因为需要在方法体中使用特定于该类的方法!

我正在想我的原始界面是问题,我应该指定参数应该 extend pawn而不是实际上需要是一个,但是我没有看到任何方式在ActionScript中实现它。

......或者我可能完全走错了路,在这种情况下,会很感激地收到建议!

我意识到我无法进行继承,但我正在制作的游戏更多的是面向对象编程的练习,因为它比我以前的规模更大。然而,我已经离开了我的安慰语言(Java),我真的不知道该怎么做。

任何帮助都将不胜感激,谢谢。

5 个答案:

答案 0 :(得分:1)

您不需要覆盖重写方法的签名以匹配协变类型。如果在子类的方法中需要特定类型,则必须检查/强制转换重写方法。

答案 1 :(得分:1)

在AS3中实现接口时,签名必须完全匹配。

您可以在运行时检查类型,如下所示:

public override function onEnter ( pawn:Pawn ) :void
{
    var boy:Boy = pawn as Boy;
    if(boy)
    {
        trace("Hey");
    }
}

答案 2 :(得分:0)

public override function onEnter ( pawn:Pawn ) :void
{
  if(pawn is Boy)
  {
    //do something else
  }
  else
  {
    //do the normal
    super.onEnter(pawn);
  }
}

答案 3 :(得分:0)

我想我会通过向上转换到每个具体类中我需要的类型来解决这个问题,所以根据你的例子:

public override function onEnter ( boy:Boy) :void { trace("Hey"); }

我会将其更改为:

public override function onEnter ( pawn:Pawn) :void 
{  
     // do something all pawns can do!
     pawn.move();

     // do something only a boy can do!
     Boy(pawn).doSomething();
}

我肯定会使用基类,是的,它确实是ActionScript 3不像Java那样支持抽象类,但这并不能阻止你创建基类并重写方法,我会仍然在接口上键入基类。

答案 4 :(得分:0)

我认为你需要一个由BoyPawn实现的界面,让我们说IPlayer

public class Boy extends Sprite implements IPlayer

并且

public class Pawn extends Sprite implements IPlayer

您创建一个名为IPlayer的接口,该接口具有所有匹配的公共函数和getter / setter。

package
{
   public interface IPlayer
   {
      function destroy():void;
      function get x():Number;
      function get y():Number;
   }
 }

现在,您可以像这样更新您的功能

function onEnter ( player:IPlayer ) :void;
function onLeave ( player:IPlayer ) :void;       
function onGameTick ( player:IPlayer ) :void;        
function onAnimEnd ( player:IPlayer ) :void;

如果扩展类,则不会出现覆盖参数类型的问题,因为类型有点抽象到两个类都扩展的接口中。