2012-05-23 56 views
0

我工作在AS3一個基於組件的引擎和我有在遊戲對象的函數返回基於它的類型的組件:AS3聰明型。定義

gameObject.Has(Body); //This will return a reference to the gameobjects body component 

我有問題正在訪問該組件。要做到這一點,我必須這樣做:

Body(gameObject.Has(Body)).SetVelocity(5); 

有沒有人有更好的方式做到這一點?

編輯:

public function Has(type:Class):BaseComponent 
{ 
    for each(var component:BaseComponent in m_components) 
     if (component is type) 
      return component; 

    return null; 
} 

回答

0

你目前擁有的東西已經返回類型()?

如果你想避開類型檢查。你可以讓你的Has()方法返回Object類型。

public function Has():Object{ 
    ... 
    return anObject; 
} 

#then you can call any prop/method without throwing type errors. 
gameObject.Has(Body).SetVelocity(5) 

沒有然而保持類型檢查沒有鑄造的變種,這你已經做在你的示例代碼的好方法。

+0

是的,我想過這樣做。我真的希望AS3有模板和預處理指令。 – user1133079

+0

我也想寫一個按類型索引的函數的數組,但看起來好像過度殺死。 – user1133079

+0

在AS3中,我很少會設置這樣一個通用的m_components數組。我想它是一個你有很多不確定的對象的情況下,你正在跟蹤或者你正在嘗試編寫更少的代碼。如果你想讓自己更容易處理Body,可以使用getter:'public function get body():Body'來包裝並投射該項目。 – LessQuesar

0

看來你的問題是你試圖在你的實現中過於通用。這引入了兩個可能的失敗點:在「in」一側,您可以在其中加載一個不是Body的Body的BaseObject,在「out」一側,您的gameObject可以返回一個不是一個Body(目前的實現顯然是類型安全的事實不是給定的)。

你知道任何時候你打電話什麼都是真的是你需要它返回一個特定類型的對象(因爲你會調用方法),所以爲什麼不讓生活只需製作明確的getter和setter就可以讓自己更輕鬆?

或者你可以得到完全荒謬和泛化您BaseObject這樣的:

gameObject.has(Body).callMethod('setVelocity').to(5); 
0

我們正在做的那種同樣的事情在我們的項目。但我們有另一個approuch。我們在ObjectUtility中有一個實用程序類。該方法返回特定根對象下的所有對象。

 public function collectObjectsByType(object:Object, type:Class, results:Array):void 
    { 

    } 

我只能顯示方法struct。