我正在尝试开发一个通用,灵活和模块化的数据结构来表示菜单。我理解OOP概念,但我有点缺乏经验,所以我想与专家分享我的设计理念。另请注意,此实现不能使用STL。
我在脑海中看到的方式是:
标题文件:
class MenuItem
{
protected:
MenuItem* m_pSibling, *m_pChild;
char m_sInfo[MENU_INFO_STRING_MAX_LEN];
bool m_active;
/* --- Option 1 ---
protected:
MenuItem* getSibling();
MenuItem* getChild();
void setActiveState(bool state);
friend class MenuController;
--- Option 1 --- */
public:
MenuItem(MenuItem* pSibling, MenuItem* pChild, bool active, const char* sInfo);
virtual ~MenuItem();
bool isActive();
const char* getInfoString();
virtual bool isEndPoint();
};
// --- Option 2 ---
class MenuItemForMenuController : public MenuItem
{
public:
MenuItem* getSibling();
MenuItem* getChild();
void setActiveState(bool state);
MenuItemForMenuController(MenuItem* pSibling, MenuItem* pChild, bool active, const char* sInfo);
~MenuItemForMenuController();
};
// --- Option 2 ---
class MenuItemUINT16Input : public MenuItem
{
protected:
uint16_t& m_pCurrentValue;
/* --- Option 1 ---
protected:
void setCurrentValue(uint16_t value);
friend class MenuController;
--- Option 1 --- */
public:
MenuItemUINT16Input(MenuItem* pSibling, bool active, uint16_t& pCurrentValue, const char* sInfo);
virtual ~MenuItemUINT16Input();
uint16_t getCurrentValue();
virtual bool isEndPoint();
};
// --- Option 2 ---
class MenuItemUINT16InputForMenuController : public MenuItemUINT16Input
{
// as before
};
现在,我希望有一个公共界面提供对 MenuItem 对象的“只读”访问,以确保传递给它们的打印对象无法修改它们。但是,我需要一个可以更好地控制 MenuController 的界面,尽管理想情况下不是完全控制。
我可以想到两种方法:
friend class MenuController
,从而提供对 MenuItem 对象的完全访问权限,并且通过我自己的约定,仅使用在已声明好友类的访问级别中定义的函数。然后仍然会有一定程度的封装。我关注速度和内存开销方面的效率。我想知道是否有更好的/另一种方式来做到这一点。我想知道是否可能有另一种解决方案来概括项目对象中包含的数据类型。
提前致谢。