2013-07-02 63 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... 
} 
相關問題