2011-05-24 41 views
1

例如,如果我有一个扩展雪碧并实现了一个对象Mungable我想这样做: -如何用类型x和接口y声明变量?

var foo:Sprite <mungable> 

,这样我可以这样做:

addChild(foo); 
foo.munge(); 

这在Actionscript 3中可能吗?

回答

2

不能直接使用。正如其他人所建议的那样,您可以创建一个类型,例如MungableSprite,该类型可以扩展Sprite并实现Mungable,然后引用该类型。但是,您只能将其用于对象,其类型是MungableSprite的子类型。

但是,您不能简单地传达类型关系“一个对象,它是Mungeable和雪碧”。

0

当然。你可以简单地将你的变量转换为接口。

public class MySprite extends Sprite implements IMungable { 
    public function munge() : void { 
     // this is the interface function to implement 
    } 
} 

var foo:Sprite = new MySprite() as Sprite; 
IMungable(foo).munge(); 

您也可以转换为MySprite调用munge()

+0

在Java中,例如,您可以将变量声明为两种类型,因此不需要进行强制转换 - 这几乎就是接口的要点。这就是我想知道如何去做的。谢谢。 – hooleyhoop 2011-05-24 15:46:51

+0

在Actionscript中不可行,您必须投射。你可能有'var foo:* = new MySprite();'为一个无类型变量。 – DanielB 2011-05-24 15:51:36

2

当然是了。

在AS3中,您不能拥有多重继承,但接口非常普遍。

对于你的界面,创建一个名为IMungable.as

package 
{ 
    public interface IMungable 
    { 
     function munge():void; 
    } 
} 

对于您的自定义精灵ActionScript文件,创建一个名为ActionScript文件MyFoo.as

package 
{ 
    import flash.display.Sprite; 

    public class MyFoo extends Sprite implements IMungable 
    { 
     public function MyFoo() 
     { 
      super(); 
     } 

     public function munge():void{ 
      trace("munging"); 
     } 
    } 
} 

然后其他地方,只需创建一个新实例并调用该方法即可。

  var foo:Sprite = new MyFoo(); 
      addChild(foo); 
      IMungable(foo).munge(); 

干杯

+1

谢谢。屁股动作中的痛苦是 – hooleyhoop 2011-05-24 15:51:00

+0

@ fakeAccount22:那么你应该考虑使用haXe。有[计划](http://code.google.com/p/haxe/issues/detail?id=271)支持这个(我认为在邮件列表中碰到问题会有所帮助:))。然而,这里的实际问题不是as3,而是Flash Player API。如果有'ISprite',你可以定义一个任意类可以随意实现的'IMungableSprite'。 – back2dos 2011-05-24 16:08:21