当前位置:  开发笔记 > 编程语言 > 正文

显示多态类

如何解决《显示多态类》经验,为你挑选了1个好方法。

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

不希望在任何地方使用反射/ RTTI进行显示的巨型switch语句,每个类都知道如何返回自己的汇总字符串,然后在列表中显示:

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

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

我不想修改每个类以便能够在GUI中显示它 - 特别是因为至少还有一个GUI平台我们想要将它移动到.

是否有某种技术可以用来将这个GUI代码从数据对象中分离出来而不需要使用RTTI和switch语句?能够取出GetSummary函数会很高兴.

理想情况下,我可以拥有一个显示类的层次结构,可以获取数据类并根据运行时类型而不是编译时类型显示它:

shared_ptr displayer = new ConsoleDisplayer(); 
// or new GUIDisplayer()

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

Dan Williams.. 6

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

查看访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern),它允许您在不更改对象本身的情况下将代码添加到现有对象.您还可以根据平台更改访问者.



1> Dan Williams..:

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

查看访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern),它允许您在不更改对象本身的情况下将代码添加到现有对象.您还可以根据平台更改访问者.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有