我的程式中有 3 個課程:
class GameObject{
private:
std::pair<int, int> position;
}
class World{
private:
std::vector<GameObject*> gameObjects;
int gravity;
}
class MovingObject : public GameObject{
private:
int velocity;
bool isSensitiveToGravity;
unsigned mass;
}
我GameObject*在 World 類中使用了一個向量,因為我想將游戲中的每個物件都放入其中,而有些物件不是 MovingObject實體。
但是我看到了一個問題:在游戲程序中,我需要回圈world.gameObjects來檢查一個物體是否對重力敏感,如果是這樣的話,我應該怎么做呢?
我的第一個想法是在類中添加一個純虛方法,該方法GameObject將在類中實作MovingObject并回傳一個物件是否對重力敏感,但這不是一個奇怪的設計嗎?
另一個想法當然是dynamic_cast在每個物件上使用,檢查 的(子)類MovingObject,然后檢查isSensitiveToGravity欄位,但是我讀了很多dynamic_cast應該避免的內容,并且幾乎總是設計不良的標志,所以我的這里有錯誤?
謝謝!
uj5u.com熱心網友回復:
當您考慮 OOP 中的功能時,您應該考慮介面而不是資料結構。情況正是如此,因此您應該創建一個帶有函式的介面interactWithGravity并使用它。如果這是一個不與重力相互作用的物體,則什么也不做。
為了強調為什么這是正確的解決方案,讓我們考慮另一種選擇,有一個引數確定它是否可以通過重力移動。這有以下缺點:
- 如果您將擁有更多引數,則影響某些物件如何與重力互動意味著向公共結構添加另一個屬性(盡管它僅與某些相關)。
- 前面的示例還建議您需要在遍歷物件的 main 函式中擴展您的案例,并使代碼更復雜且更難擴展。
- 也許您會發現在極坐標中進行“重力計算”更容易。這意味著更改不同物件中的所有計算和坐標。
如果您需要進行一些優化,持有不同的串列可能是合理的,但由于類似的原因,它的可重用性和可消耗性會降低。
該串列繼續與其他概念(如 ISP)一起使用,但您了解總體思路。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465539.html
