2012-06-13 27 views
7

出於某種原因,我不能得到這個工作(大量簡化的代碼失敗):AS3類型錯誤:錯誤#1007:實例化嘗試在非構造

package com.domain { 
    public class SomeClass { 
     private static var helper:Helper = new Helper(); 
    } 
} 

class Helper { 
} 

它編譯,但在第一次罰球的SomeClass訪問:

TypeError: Error #1007: Instantiation attempted on a non-constructor. 
    at com.domain::SomeClass$cinit() 
    ... 

回答

1

+1給達倫。另一種選擇是將Helper類移動到文件的頂部

class Helper { 
} 

package com.domain { 
    public class SomeClass { 
     private static var helper:Helper = new Helper(); 
    } 
} 
+0

不知道你可以做到這一點。沒有機會測試,但如果它有效,這是它。 – Blanka

+0

這很酷,我也不知道你能做到這一點。 這就是說,對於我的具體用例,我仍然認爲它不會起作用(我還沒有測試它tbh)......在編譯任何東西之前,Flex編譯器確實應該解析整個文件 –

+2

'語法錯誤:包是意外的 – Panzercrisis

0

你需要生成一個構造函數和類中聲明你的變量,而不是函數:

package com.domain { 
    public class SomeClass { 
     private static var helper:Helper 
     public function SomeClass() { 
      helper = new Helper(); 
     } 
    } 
} 

class Helper { 
} 
+1

有趣......這似乎是工作,但這種做法意味着你有靜態成員之前實例''SomeClass'是helper'可用。此外,在實例構造函數中初始化靜態成員有點奇怪。例如,如果您創建了'SomeClass'的多個實例,則每次都會重置靜態成員...不是您想要的。另一個例子,如果你有一個使用'helper'的靜態方法,它會發現它是'null' _until_你至少實例化'SomeClass'一次。很奇怪,至少可以說。 – Blanka

+1

你不能在構造函數內實例化。因此,每次實例SomeClass時都不會覆蓋它。 – WolvDev

+0

但是當你實例化新的Helper()時,你調用Helper類的構造函數,這就是發生錯誤的地方。助手沒有構造函數? – WolvDev

1

我認爲它不能與Helper和SomeClass在同一個文件中工作。 當SomeClass初始化時,Helper類尚未初始化,因此無法創建Helper對象。

搬家助手到一個單獨的文件應該可以解決問題。

+0

他寫道這個例子是「嚴重簡化的代碼失敗」。我認爲他有兩個分開的文件。 – WolvDev

+1

其實,他們是在同一個文件中。 @silyevsk,我認爲這確實是一個初始化順序問題。 – Blanka

+0

它**有**在同一個文件中,這是你如何在Actionscript中創建一個[private constructor](http:// stackoverflow。com/a/17464207/238419) –

2

非構造函數錯誤是編譯器說'你已經爲我還沒見過的類調用過構造函數'的尷尬方式;如果它有點聰明,它可以在抱怨之前檢查內部類的文件(編譯單元)...... mehhh

看到你已經給出了你的靜態變量private的訪問權限,顯然你打算只在內部使用該實例SomeClass假設;可作爲返回值傳遞出)。

下列溶液推遲所述靜態無功的創建到時(可能隱含的)Helper.cinit()被調用,而不是SomeClass.cinit()當內部類初始化即當Helper尚不存在:

package com.domain { 
    public class SomeClass { 

     public function doSomething(param:*):void { 
      // ... use Helper.INSTANCE 
     } 

    } 
} 

class Helper { 
    public static const INSTANCE:Helper = new Helper(); 
} 
相關問題