2014-01-23 99 views
2

我是哈克斯新手,可能這是一個非常基本的問題,我不能真正找到答案。功能新或公共靜態主

我看到三種方式來調用主類:

1)使用的main()

//Entry point 
public static main():void{ 
    //do something... 
} 

2)使用構造函數new()

//Constructor 
public function new(){ 
    // init 
} 

3)使用兩個主( )和新的()

static function main() 
{ 
    Lib.window.onload = function(e) new Main(); 
} 

public function new() 
{ 
    //init 
} 

Is there一個人使用的指導方針或最佳做法?

感謝

回答

8

解決所有3:

  1. 靜態函數main(){}是正確的入口點。無論哪個目標,Haxe總是從main()開始執行。
  2. 新()構造不會自動調用,如果你希望你的主應用程序來執行的對象,而不是從一個靜態函數,你必須明確地創建對象:static function main() { new Main(); }
  3. 有些人喜歡將它們的代碼保存在一個對象中,而不是靜態函數中,這是第三個示例的來源。我通常會這樣做,這就是你在第三個例子中展示的內容。

幾個加分:

  • 解釋here東西都執行的工序,基本概括:
    • 所有類型/類被註冊
    • Boot.__init()運行特定平臺的初始化
    • 具有static function __init__()初始化方法的類被初始化
    • 靜態變量是intiailzed如果您編譯一個類沒有-main Main參數
    • main()功能執行
  • ,但與類路徑/名作爲參數(如haxe my.pack.MyClass),並沒有public static function main(),該類是編譯的,但它不會自動運行。如果你正在創建一個類庫或類似的東西,這會很有用 - 你的類在那裏,但它需要被其他一些Javascript等明確調用。
  • 在Javascript中,Haxe代碼在加載後立即開始運行,可能在DOM準備好之前。這就是爲什麼它是一個好主意,做:

    static function main() { 
        js.Lib.window.onload = function(e) { runMyApp(); } 
    } 
    

    正如你在你的例子一樣,這是如果你希望你的代碼後運行的DOM準備好一個好主意。無論您是在負載上調用另一個靜態函數,還是實例化一個new MyApp()並從那裏運行您的應用程序,這取決於您。

+0

關於你的第二個額外要點的評論:當你省略-main參數時,haxe編譯器拒絕編譯。它也拒絕編譯一個沒有定義靜態主函數的主函數。 – xastor

+0

@xastor如果您插入類名稱(包括完整的包路徑),它將起作用。我會編輯我的答案以包含該內容。謝謝:) –

+0

甜! Byebye主要存根:) – xastor