2011-09-05 13 views
3

我有以下軟件包:AS3內部和自定義命名空間

spark
        spark.engine

spark我有一個類SeCore;並在spark.engine內我有SeStepperSeKeyboard

我試圖實現的是SeCore是唯一可以創建SeStepperSeKeyboard的實例的類。這可以通過將SeCore轉換爲spark.engine包並將其他兩個類internal來實現,但如果可能的話,我希望在spark包中有SeCore

我試着讓我自己的命名空間來處理這個問題,像這樣:

package spark.engine 
{ 
    import spark.namespaces.spark_core; 

    use namespace spark_core; 

    spark_core class SeStepper extends SeObject 
    { 
     // 
    } 
} 

但是我得到的錯誤:

1116: A user-defined namespace attribute can only be used at the top level of a class definition.

有沒有我可以達到什麼樣的任何其他方法我在之後?

+0

在運行時檢查確定,還是你想在編譯時? – RIAstar

+0

RIAstar,編譯時更可取,但運行時正常,因爲我可以拋出一個錯誤。 @Jevgenij Dmitrijev你的評論與任何事情有什麼關係? – Marty

回答

1

99%的時間,標記爲'內部'是一個壞主意。最好爲「禁區」類和成員制定命名規則,並允許開發人員自行承擔風險。將事物標記爲「內部」或「私人」是應該很少進行的事情,並且要有深思熟慮。

但是,您可以在運行時通過在SeCore中使用只讀屬性並從SeStepper和SeKeyboard中檢查其值來強制實施此行爲。

以下是僞碼,一會兒沒有用過AS3。

在SeCore

private var _createAuthorized = false; 
public function get CreateAuthorized():boolean {return _createAuthorized;} 

private function createSeStepper(){ 
    _createAuthorized = true; 
    var obj = new SeStepper(this) 
    _createAuthorized = false; 
    return obj; 
} 

在SeStepper

public function SeStepper(core:SeCore){ 
    if (!core.CreateAuthorized) throw new Error("Only SeCore can do this"); 
} 
+0

重申您的第一個注意事項:基本上,我正在創建一個引擎,您可以在其中創建SeCore實例(在構造函數中創建其他類的實例,例如步進器和鍵盤)。通過core.keyboard等獲得這些類的訪問權限,但我不希望人們自己創建它們的實例。希望清除任何建議,我的編碼風格是奇怪的/有問題的。當然,我可以簡單地使用命名約定,但我試圖儘可能鎖定不應該訪問的內容,以避免混淆。 – Marty

0

我不能回答同意,我的意思是讓事情公開是方式邀請黑客。我可以在我想要的任何環境中執行任何我的計算機上運行的任何公共函數,我甚至可以在內存中覆蓋它們的執行,因爲它們很容易找到,而像私人/內部函數那樣做幾乎是不可能的。

+0

我願意接受優秀的答案,因爲您的意見也是我的想法。 – Marty