我想使用腳本語言嵌入一些遊戲類。假設我的主要結構是:類的透明聚合
class BaseGameObject {
public:
virtual ~BaseGameObject() { }
};
class DerivedGameObject : public virtual BaseGameObject {
};
然後,我想附上關於如何在腳本引擎上綁定此類的信息。我想保持凝聚力與他們儘可能小,所以我這個模板模式結束:
class ScriptLanguageBinder {
public:
virtual void bind(VM* vm) = 0;
};
template < typename GameObject >
class GameObjectLanguageBinder : public GameObject, public ScriptLanguageBinder {
virtual void bind(VM* vm) {
vm->bind<GameObject>(static_cast<GameObject*>(this));
}
};
template < typename GameObject >
BaseGameObject* gameObjectBuilder() {
return new GameObjectLanguageBinder<GameObject>();
}
所以我有一個工廠,打造「包裝」 BaseGameObject和到位返回GameObjectLanguageBinder。這樣,系統的其餘部分將結果類用作BaseGameObject *,腳本語言依賴關係被限制在一組不會損害Game生態系統的類中,並且只有我的Script引擎需要知道它實際上是GameObjectLanguageBinder。這是工作得非常好,除了一點:
要從BaseGameObject取回ScriptLanguageBinder對象*我需要這樣做:
ScriptLanguageBinder* binder = dynamic_cast<ScriptLanguageBinder*>(my_game_object);
,因爲我想擠都來自表現我可以這是不可取的代碼執行(這是一個手機遊戲引擎,所以是的,性能計數)。
所以我想知道是否有一些非突兀,透明的方式來實現這個沒有使用動態演員。我以爲在使用訪問者模式時,當你想擴展你訪問的類時,這種模式是一種阻礙,所以這是不行的。
ps:工廠是超在這個例子中過分簡化。
注意:如果打算只刪除一個指向基類的指針,絕對需要一個虛擬析構函數。從本質上講,這可以作爲您需要的一個虛擬功能。 :p – Xeo 2012-03-23 02:45:44
是的,我知道。類沒有這些,我只是簡化了這裏的一切:) – scooterman 2012-03-23 11:34:59