0

我有一个类,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)。但是,我需要它来接受一个男孩,因为该类特定的方法需要在方法体中使用!

我认为我的原始界面是问题所在,并且我应该指定参数应该改为扩展pawn 而实际上不需要是一个,但是我没有看到任何在 ActionScript 中实现它的方法。

...或者我可能完全走错了路,在这种情况下,我们将不胜感激地接受建议!

我意识到我无法继续进行继承,但我正在制作的游戏更多的是面向对象编程的实践,因为它比我习惯的更大规模。然而,我已经摆脱了我的舒适语言(Java),我真的超出了我自己在这里做什么。

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

4

5 回答 5

1

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

于 2012-06-15T18:44:24.537 回答
1

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

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

public override function onEnter ( pawn:Pawn ) :void
{
    var boy:Boy = pawn as Boy;
    if(boy)
    {
        trace("Hey");
    }
}
于 2012-06-15T19:55:13.890 回答
0
public override function onEnter ( pawn:Pawn ) :void
{
  if(pawn is Boy)
  {
    //do something else
  }
  else
  {
    //do the normal
    super.onEnter(pawn);
  }
}
于 2012-06-16T10:08:14.110 回答
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 那样支持抽象类,但这并不能阻止您创建基类并覆盖方法,我仍然会键入无论如何,接口的基类。

于 2012-06-16T18:35:04.333 回答
0

我认为您需要一个由Boyand实现的接口,Pawn比如说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;

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

于 2012-06-17T17:08:06.253 回答