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

Actionscript 3 使用接受AS3中不同类型参数的方法创建子类,actionscript-3,flash,oop,polymorphism,abstract-class,Actionscript 3,Flash,Oop,Polymorphism,Abstract Class,我有一个类,Pawn,它是游戏中所有“角色”的基类,具有诸如健康、可以移动、死亡或说话等属性。扩展这个类的一个类是“男孩”类。“男孩”类是这个游戏中玩家控制的角色 为了控制字符“状态”,创建状态类。这些方法有OneInterState、onStateTick和onLeaveState等。状态可能用于表示蹲、走、跳,并将发送诸如“按键”之类的消息“您不需要重写被重写方法的签名来匹配协变类型。如果在子类的方法中需要特定类型,则必须检查/强制转换被重写的方法。在AS3中实现接口时,签名必须完全匹配 您

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


为了控制字符“状态”,创建状态类。这些方法有OneInterState、onStateTick和onLeaveState等。状态可能用于表示蹲、走、跳,并将发送诸如“按键”之类的消息“您不需要重写被重写方法的签名来匹配协变类型。如果在子类的方法中需要特定类型,则必须检查/强制转换被重写的方法。

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

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

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

我想我应该通过向上转换到每个混凝土类中需要的类型来解决这个问题,因此根据您的示例:

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();
}

我肯定会使用基类,是的,ActionScript3确实不像Java那样支持抽象类,但这并不妨碍创建基类和重写方法,我仍然会将基类键入接口。

我认为您需要一个由
Boy
Pawn
实现的接口,比如说
IPlayer

public class Boy 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;

如果扩展该类,您在重写参数的类型方面没有问题,因为该类型有点抽象到两个类都扩展的接口中。

您的意思是不需要重写,而是会创建一个重载方法?这难道不意味着接口合同将无法成功履行吗,因为将不会有onEnter(pawn:pawn),而只有onEnter(boy:boy)?这可能会完全违背接口的目的。好吧,这要看情况而定。如果男孩提供完整的合同,典当应该以不同的方式履行合同。因此,基本接口可以满足功能要求。ActionScript没有泛型,也不允许对协变或逆变方法签名进行重写,因此基本上这取决于您要完成的任务。我意识到我很久以前问过这个问题,但我从来没有选择过最佳的方法。我真没礼貌。谢谢你的回答,我最终按照建议实现了。酷。我很高兴我能帮上忙。没有为您提供某种抽象类,您遇到的具体问题是什么?我感到困惑,因为每当您将基类应用于库符号时,基类就充当了抽象类,而为库符号生成的类就是具体的实现。这只是一个例子,但我一直使用抽象/基类。
public class Boy extends Sprite implements IPlayer
public class Pawn extends Sprite implements IPlayer
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;