2013-08-03 65 views
4

我一直想知道一段時間以來我一直在使用我的遊戲引擎和遊戲的設計。假設我們有一個Object類課程界面查詢

class Object 
{ 
    public: 
     const std::string& getName() { return m_name; } 

    private: 
     std::string m_name; 
} 

然後,我有一個名爲ObjectManager的類,它包含Object的一個實例。現在,我一直想知道是否應該在ObjectManager中保留該實例的私有屬性,並重復代碼以便它可以調用getName(),或者使Object公開,從而破壞封裝的概念。你們認爲哪種設計更好?

感謝您的幫助!

+5

順便說一句,的g​​etName返回類型爲void,你正在返回我的一個字符串 – billz

+0

是的,錯誤的。我在我的手機上輸入了問題,顯然沒有引起足夠的重視。 – Peter

+0

我不一定認爲代表團是重複的。如果你要改變Object :: getName()的名字,它會立即暗示你還需要改變ObjectManager :: getName()的名字? –

回答

1

如果您的類包含一個對象可供其他人使用,請將其公開。封裝意味着隱藏需要做某些事情的變量。某些數據成員不屬於這一點。

例如:

人tom;

tom.getEyes().getColor(); 
    tom.getMouth().eat(tomato); 
    tom.legs().walk(); 

人可以掩蓋一切,但它會很麻煩:

tom.getEyesColor(); // accessor for every eye feature 
    tom.eat(tomato); 
    tom.walkAndEat(); // every possible combination of actions 

進一步例如:

grid.row(3).col(5).setText("hello"); 

這裏列類可能暴露許多方法,而無需電網類被感動。這是面向對象編程的美妙之處。

如果您命名您的類ObjectManager,我感覺它是爲其他人管理Object實例,因此您應該公開它。另一個主意,用繼承的也是正確的:

class ObjectManager : public Object 
    { 
    }; 
+0

感謝大家的幫助! – Peter

0

如果您只想將接口限制爲方法,那麼請保留該對象的私有屬性,並使用訪問器方法向私有對象返回一個常量引用(如果需要,則返回非常量)。

此外,如果適用,繼承是一個不錯的選擇。

+0

這實際上是我原本的設計,但我認爲這是一種糟糕的編碼風格。我錯了嗎? – Peter

+0

如果您認爲Object類設計得很好,那麼返回對象實例的引用應該不錯 –

+0

C++容器通過引用 –

0

這取決於你在做什麼。如果我正確理解你的問題,我個人更傾向於使Object成爲ObjectManager的私有成員,並向ObjectManager添加一個函數以充當Object :: getName()的代理。 (這是你的問題嗎?)但是,如果你只是特別簡單地包裝,並沒有試圖做一些特別的技術或你有什麼,我可能會試圖回答否則。這取決於,但更可能的是,繼續前進,並將其設爲私人並添加額外功能。請注意,這個答案是基於這樣的假設,即你將在這裏大量使用繼承。

+0

公開存儲的對象到目前爲止,在表示引擎代碼庫中Object的實際類中,它有超過60個方法,我已經在ObjectManager中複製了它,因此它可以調用私有成員。 – Peter

+0

對象有每個方法嗎?這真的減少了它隱藏的目的。 ObjectManager中有多少個字段或運算符重載是不是在ObjectManager中進行代理?如果有一堆,那麼這兩種方法都不是特別好,我會說。但是,如果在ObjectManager中沒有代理的情況下,ObjectManager中沒有任何東西,我會說1)將對象公開,而是2)找到一種簡化代理的方法,或者3)從Object繼承。 – Panzercrisis

0

這真的取決於情況(對不起,非答案!)。如果你想支持強大的封裝性,你可能會想的ObjectManager看起來是這樣的:

public class ObjectManager 
{ 
    private: 
     Object obj; 
    public: 
     string GetNameOfInnerObject(); 
} 

正如你看到的,我改變了方法頭是描述相對於的ObjectManager。這種類型的方法命名可以派上用場,將對象內部更復雜的交互抽象出來。

編輯:如果您告訴我們ObjectManager應該做什麼,它可能會有所幫助。它是否有任何方法不直接與你的內部對象相對應?

相關問題