我已经在C++和Python中创建了一个控制台菜单,但我认为语言并不太重要,因为我正在询问类的结构。
所以我尝试实现的是一个类似于MS-DOS的菜单,其中我可以有父菜单(文件夹)和动作菜单(文件)。这是在控制台中打印出来的样子:
所以你可以看到,我这里有两种类型的菜单;
这可能只是一个人的观点,但我已经思考了一段时间,无法找到一种方法比另一种优越,它们都有其优势和缺点,并且都能很好地工作。因此,我想问一下您的意见,如果有人选择其中一种方式,请告诉我原因。基本上,我正在寻求原因,不关心您的意见。
除文件夹和文件之外,将没有其他菜单类型,因此基类不能用于其他任何内容。
编辑:如何使用菜单的简单Python和C++示例:
只有一个类的Python:
所以我尝试实现的是一个类似于MS-DOS的菜单,其中我可以有父菜单(文件夹)和动作菜单(文件)。这是在控制台中打印出来的样子:
[-] Root directory
Open snakegame
[-] First sub directory
Print out stupid messages
[+] Closed directory in open directory
Shutdown computer
[+] These directories are closed
[+] You can't see the content inside them
Quit menu
所以你可以看到,我这里有两种类型的菜单;
- 目录(MS-DOS文件夹)菜单,其中包含其他菜单。当激活时,它们会打开/关闭。例如:现在“根目录”已经打开,您可以看到其中所有的菜单。如果关闭,则“[-]”变为“[+]”,您将无法看到任何其他菜单。
- 动作(MS-DOS文件)菜单,与一个函数相关联。当激活时,它们调用它们所链接的函数。例如:“打开贪吃蛇游戏”可以链接到一个名为“startSnakeGame()”的函数,该函数将关闭菜单并启动贪吃蛇游戏。
我已经编写了两个可工作的实现来获得想要的结果,我只是想知道,我应该使用哪一个?第一种方式是,我只有一个称为“Menu”的类,并且它具有所有成员变量和方法编码到一个类中。另一种方式是,我将这两种不同类型的菜单分别分为两个类,并具有共同的基类。
这里有一些成员变量,我现在将它们分为三个部分(基类、目录类和动作类),但它们可以合并成一个类。
基本菜单:
parent
= 一个菜单(目录),将this/self
作为子项存储在列表/向量中。label
= 显示菜单时显示的标签。selected
= 布尔值,指示菜单当前是否被选中(例如由鼠标指向)。
目录菜单:
subMenus
= 一个列表或向量(在C++中),其中包含其他菜单。open
= 布尔值,指示菜单是打开还是关闭。
动作菜单:
action
= 指针,指向激活此菜单时调用的函数。
正如您所看到的,只有少数变量与其他类不同,如果设置action == 0
(没有动作),则菜单会自动更改open
以依赖于其当前值的false/true
。这样,动作菜单将被终止,唯一的缺点是动作菜单将保留subMenus
和closed
而无用。
这可能只是一个人的观点,但我已经思考了一段时间,无法找到一种方法比另一种优越,它们都有其优势和缺点,并且都能很好地工作。因此,我想问一下您的意见,如果有人选择其中一种方式,请告诉我原因。基本上,我正在寻求原因,不关心您的意见。
除文件夹和文件之外,将没有其他菜单类型,因此基类不能用于其他任何内容。
编辑:如何使用菜单的简单Python和C++示例:
只有一个类的Python:
# Using default param. here to set "action = None" or "action = toggleOpen()"
root = Menu(None, "Root directory")
snake = Menu(root, "Open snakegame", startSnakeGame)
sub1 = Menu(root, "First sub directory")
printMsg = Menu(sub1, "Print out stupid messages")
...
Python多类使用:
# With multiple classes, action parameter no longer exists
root = DirectoryMenu(None, "Root directory")
snake = ActionMenu(root, "Open snakegame", startSnakeGame)
...
一类C++:
Menu* root = new Menu(0, "Root directory");
Menu* snake = new Menu(&root, "Open snakegame", &startSnakeGame);
...
使用多个类的C++:
DirectoryMenu* root = new DirectoryMenu(0, "Root directory");
ActionMenu* snake = new ActionMenu(&root, "Open snakegame", &startSnakeGame);
...
第二次编辑: 我只在Python中实现了两种方式,而在C++中只实现了一种。因此,我开始在C++中编写多类方法,只是为了好玩和练习,但是我遇到了一个问题;由于有一个基类,我不能将this
添加到父类的subMenus
向量中,因为基类不拥有subMenus
,并且基类无法知道DirectoryMenu
。
因此,我将不得不通过hack的方式解决这个问题,这是一个很大的缺点。除非有人能想出一个好的实现方法?
BaseMenu::BaseMenu(BaseMenu* parent)
: m_parent(parent) // works
{
m_parent->addSubMenuk(this); // BaseMenu doesn't have Directory's addSubMenu()
}
BaseMenu
中定义addSubMenu()
和removeSubMenu()
,并将它们都设为抽象方法。这样做是可行的,但我仍然认为这种方式不比其他方式更好。每个Menu
对象中有一个无用变量似乎并不比有两个抽象方法更糟糕,而这两个方法在ActionMenu
中也没有被使用。 - user1632861