菜单数据结构和界面设计

时间:2015-12-05 11:24:33

标签: c++ oop design-patterns

我正在尝试开发一个通用,灵活和模块化的数据结构来表示菜单。我理解OOP概念,但我有点缺乏经验,所以我想与专家分享我的设计理念。另请注意,此实现不能使用STL。

我在脑海中看到的方式是:

  • 类MenuItem :它是一个导航节点,即它只包含其他节点,一个字符串,并且没有可修改的参数(这是此菜单的主要目的 - 修改分类参数)
  • 类MenuItemUINT16Input :我将此称为终点节点,因为它具有可修改的参数,因此不再有子节点。它源自 MenuItem 类。 UINT16 sufix表示包含的参数类型的类型。我还没有找到任何其他方法来进一步概括这个 MenuItemInput 组件来接受其他数据类型(float,bool,char [],...)通过从中派生,或者派生自己来自一个额外的界面。请参阅代码以获得澄清。
  • 类MenuController :这个管理MenuItems,保持对当前项的引用并提供一个公共界面来导航菜单。它还需要一种机制来为打印菜单的对象(此处未显示)提供所需的信息。

标题文件:

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 的界面,尽管理想情况下不是完全控制。

我可以想到两种方法:

  • 选项1:使用friend class MenuController,从而提供对 MenuItem 对象的完全访问权限,并且通过我自己的约定,仅使用在已声明好友类的访问级别中定义的函数。然后仍然会有一定程度的封装。
  • 选项2:继承所有 MenuItem MenuItemUINT16INPUT ,以及将来添加的其他公共函数 MenuController

我关注速度和内存开销方面的效率。我想知道是否有更好的/另一种方式来做到这一点。我想知道是否可能有另一种解决方案来概括项目对象中包含的数据类型。

提前致谢。

0 个答案:

没有答案