gpt4 book ai didi

c++ - 显示多态类

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:18 27 4
gpt4 key购买 nike

我有一个带有命令行界面的现有应用程序,我正在向其添加 GUI。经常出现的一种情况是,我有一个继承自一个类的对象列表,需要在列表中显示,但每个子类的显示方式略有不同。

不想使用反射/RTTI 到处都有巨大的 switch 语句来进行显示,每个类都知道如何返回自己的摘要字符串,然后将其显示在列表中:

int position = 0;
for (vector<DisplayableObject>::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp)
cout << ++position << ". " << iDisp->GetSummary();

相似的功能可以在不同的上下文中显示不同的信息。在我们需要添加 GUI 之前,这一切都很好。字符串不再足够 - 我需要创建图形控件。

我不想必须修改每个类才能在 GUI 中显示它 - 特别是因为至少还有一个 GUI 平台我们希望将其移动到。

是否有某种技术可以用来将此 GUI 代码从数据对象中分离出来,而无需求助于 RTTI 和 switch 语句?如果也能去掉 GetSummary 函数就好了。

理想情况下,我能够拥有显示类的层次结构,这些显示类可以采用数据类并根据运行时类型而不是编译时类型显示它:

shared_ptr<Displayer> displayer = new ConsoleDisplayer(); 
// or new GUIDisplayer()

for (vector<DisplayableObject>::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp)
displayer->Display(*iDisp);

最佳答案

我认为这不会解决您不需要编写代码的问题,但您应该能够从数据对象中抽象出 GUI 逻辑。

查看访问者模式 (http://en.wikipedia.org/wiki/Visitor_pattern),它允许您向现有对象添加代码,而无需更改对象本身。您还可以根据平台更改访问者。

关于c++ - 显示多态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com