2013-07-02 40 views
1

我是ActionScripting的新手,但我做了一些Java。我被告知他们有点相似。我编写了一些AS3集成的SWF文件。你可以重写AS3中的函数吗?

function init():void{ 
    // do something 
} 

function init(var string:String):String{ 
    // do something else 
} 

这是不是允许在AS?如果没有,除此之外还有另一种处理方法吗?

在此先感谢。

+0

只是添加,我跑了这个,并得到了错误1021:重复函数定义。对不起,应该在最初添加。 – seroth

回答

5

是的,你可以重写的功能。但是你给出的例子并不是压倒一切 - 它是超载。重写一个函数,你基本上只是创建一个具有相同签名和一个子类中的所有东西的函数,并在它之前添加单词“override”。

虽然你不能直接重载一个函数。如果您需要可变数量的参数,则必须改为使用可选参数。像这样:

function init(str:String = null):String 
{ 
    if (str == null) 
    { 
     // do one thing 
     return null; 
    } 
    else 
    { 
     // do another thing 
     return "someString"; 
    } 
} 

而这就是你将能够在AS3中做的最好的。至少严格来说,无法超负荷功能是一种相当普遍的抱怨和语言的明显缺陷。

1

你的意思是方法重载?令人遗憾的是,Actionscript不支持这一点。

要避开它,你可以使用默认参数,或者只是让你的参数少一点限制。 This answer有一些细节。

你可以试试这个:

function init(var string:String = "Default value"):String{ 
    // do something 
} 
+0

重载,是:-(。它是否处理方法重载的方式不一样 – seroth

+0

@seroth根本不可能只有一个给定名称的方法,这很可能是因为AS具有高级别函数类型。 – poke

1

ActionScript不支持方法重载。但是,基于the answerthis question您还有其他选择。

如果你只是想能够接受任何类型的,你可以使用*来 允许任何类型:

function someFunction(xx:*, yy:*, flag:Boolean = true) 
{ 
    if (xx is Number) { 
    ...do stuff... 
    } else if (xx is String) { 
    ...do stuff... 
    } else { 
    ...do stuff... 
    } 
} 

如果你有大量的地方顺序 不重要的各种参数,使用选项对象:

function someFunction(options:Object) 
{ 
    if (options.foo) doFoo(); 
    if (options.bar) doBar(); 
    baz = options.baz || 15; 
    ...etc... 
} 

如果你有可变数量的参数,你可以使用... (rest) parameter

function someFunction(... args) 
{ 
    switch (args.length) 
    { 
    case 2: 
     arr = args[0]; 
     someBool = args[1]; 
     xx = arr[0]; 
     yy = arr[1]; 
     break; 
    case 3: 
     xx = args[0]; 
     yy = args[1]; 
     someBool = args[2]; 
     break; 
    default: 
     throw ...whatever... 
    } 
    ...do more stuff... 
} 

很多情况下你需要拨打的共同作用多项 班的情况下,应指定常见的接口,每个类:

function foo(bar:IBazable, flag:Boolean) 
{ 
    ...do stuff... 
    baz = bar.baz() 
    ...do more stuff... 
} 
相关问题