今天想寫個雜訊類別的時候遇上的問題
上網拜神看到有人問了一樣的問題
回答也很清楚
不過
既然我現在很閒
加上這篇用字很簡單
加上應該很多人跟我一樣英文閱讀超慢
加上如果不用心寫個翻譯的話我一定會隨便看一看然後下禮拜就忘記
所以就來亂翻一下
問:
Actionscript 明明就是建立在物件導向的架構上
為什麼它不支援重載 (註1)?
Flex (註2) 支援它嗎?
答:
沒錯,Actionscript 的確不支援重載,當然Flex也是
但我們的函數可以有預設的參數
像這樣:
public function DoSomething(a:String='', b:SomeObject=null, c:Number=0):void
於是 DoSomething() 函數可以用 4 種方法來呼叫它:
DoSomething()
DoSomething('aString')
DoSomething('aString', anObject)
DoSomething('aString', anObject, 123)
這樣搞是因為Actionscript遵循ECMA腳本標準(註3)
函數被當作是物件的屬性(property)之一
所以,就像你不能讓物件擁有重複的屬性一樣,方法(method)也不能重名
在83頁的位置說明了當你宣告一個函數像這樣:
function Identifier(arg0, arg1) {
// body
}
的時候
就是在物件中宣告了一個屬性ID
而它的值是一個function物件(註4)
new Function(arg0, arg1, body)
這就是你不能重載的原因
因為 Actionscript 將類別中的函數視為一個裝著函數物件的屬性
註1:
overload,重寫同名函數使呼叫函數者可以選擇帶入哪些參數的技巧
比如在JAVA我們會這樣寫
public setCanvas(int width, int height){}
public setCanvas(int alpha){}
當這樣呼叫的時候
painter.setCanvas(50, 50);
它會設定畫布的長寬
而
painter.setCanvas(0.6);
這樣它會設定畫布的可見程度
呼叫同一個函數名,用帶入什麼樣的參數來決定做什麼
註2:
用來開發RIA程式的工具
它把Flash Player當作VM來使用
讓桌面應用程式可以靠瀏覽器來操作
利用各平台上的Flash Player用不同的實作來達到跨平台的目的
註3:
ECMA是一個國際協會
它負責制定各項標準
C#、C++、Javascript等等語言的規範都是由它來負責
註4:
在 Actionscript、Javascript 等等語言中
函數被視為一個物件( AS 根本所見皆物件......)
也就是說它具有實體
可以被 new 出來
也可以被當作參數傳遞(不要懷疑!)