不同类型的对象,其属性差异比较大但是需要一致对待,请教思路,详情入内,可另外开贴给分!

higaer 2005-02-22 05:50:13
为方便起见,我用个假想的例子来描述这个问题:
设想某组织需要一个计划系统,实现制定计划、执行计划和实时显示执行情况三个主要功能。计划有很多种,例如生产计划、销售计划、培训计划,不同类型的计划具有一些共同的属性,比如说名称、起始时间、结束时间、进度,又具有差异很大的属性,如生产计划的物料,销售计划的片区,培训计划的课程等等。现在的要求是一致地对待这些计划,具体到三个功能分别如下:
(1)制定计划时所有计划列在一个列表中(数据结构也要求是在一个列表),既要显示共同的属性,又要显示不同的属性,大致如下所示,但是不同的属性的类型和值都不一样,属性的个数也不一样。
编号 类型 名称 起始时间 结束时间 其他独特的属性(*)
1 生产 生产砖头 2月4日 5月10日 物料:泥、水;车间:#3
2 培训 春季培训 2月8日 2月28日 课程:生产砖头大法;对象:全体员工;培训级别:3
3 销售 红色风暴行动 2月10日 3月25日 片区:西南、东北、东南、中南、华北
……
功能支持一般的增删改和保存和打开,保存时是所有计划保存在一个文件中。
* 这里只是说明大概,如何处理(显示、编辑、保存、加载)不同计划的独特属性正是我需要知道的
(2)执行计划时,从列表中取得计划项,然后开辟线程去执行,不同类型的计划用不同类型的线程。
(3)执行计划过程中,执行线程实时地上报进度、日志等信息,这些信息又需要集中显示,比如假定用带有编号的线来表示进度,所有计划的进度情况在一个图中显示,用带编号的字符消息列出日志,所有日志记录在一个列表中列出,如下所示,而主要的问题在于不同类型的计划执行,相应于其独特的属性上报的信息内容和格式也不一样。
进度:
1------------------------------------50%
2--------------------------30%
3----------------------------------------------60%
……
日志:
计划编号 日期 时间 消息内容
1 2月25日 22:30 物料短缺,生产被迫中止
2 2月26日 18:00 培训中期考试,十人作弊
1 2月26日 21:00 恢复生产
……
...全文
161 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2005-02-28
  • 打赏
  • 举报
回复
相同的可以用类派生体系,不同的可以用 xml 或者其它格式的 meta data
FireEmissary 2005-02-27
  • 打赏
  • 举报
回复
face模式
io(王飞) 2005-02-26
  • 打赏
  • 举报
回复
我做过一个项目和你的差不多。我们是这样的:计划就用继承,有几种计划就有几个子类,这个似乎没法取巧。制定一个计划就是生成这样的一个子类实例并把它加入到列表中,这个就是取窗体用户输入的数据,然后生成一个对象就可以了。CarryOut则开线程处理,并把日志写到一个文本文件里,每个线程都有自己的日志文件。PrintResult()则是这样的:设置一个定时器,比如一秒,取该日志文件的一行,写到界面上。
higaer 2005-02-22
  • 打赏
  • 举报
回复
忘了说明是在Windows GUI下的——用VC++和C++Builder做

我想大家会觉得这个问题就像教科书一样,是典型的多态问题,用虚函数机制来解决。但是多态这个东西我也用得不少,但是这里有些地方总想不通,比如说主要就三个方法吧:
CustomParam(); // 定制计划,说白了就是填写参数
CarryOut();// 执行计划
PrintResult();// 实时报告计划执行的结果

因为是VC、CBuilder下做,定制计划(填写参数)是要调用Dialog或者Form来输入,但是在CustomParam中调用对话框、窗体显然不妥,因为计划更多的是一个实体类,我感觉实体类里面不应该关联界面类,PrintResult也类似。此外,这里如果把界面、控制和数据都混在一起,是有违MVC的原则的。实际上,我比较关心的是计划项的数据结构,计划项基本上只有一些简单的获取、设置和保存属性值的操作就够了,但是要处理差异的属性,很头疼啊。

higaer 2005-02-22
  • 打赏
  • 举报
回复
实在不好意思,还是不妥,再调整一下

编号 类型 名称 起始时间 结束时间 其他独特的属性(*)
1 生产 生产砖头 2月4日 5月10日 物料:泥、水;车间:#3
2 培训 春季培训 2月8日 2月28日 课程:生产砖头;培训级别:3
3 销售 红色风暴 2月10日 3月25日 片区:西南、东北、东南、中南、华北
……
日志:
计划编号 日期 时间 消息内容
1 2月25日 22:30 物料短缺,生产被迫中止
2 2月26日 18:00 培训中期考试,十人作弊
1 2月26日 21:00 恢复生产
……
higaer 2005-02-22
  • 打赏
  • 举报
回复
格式乱了,重新调整一下
编号 类型 名称 起始时间 结束时间 其他独特的属性(*)
1 生产 生产砖头 2月4日 5月10日 物料:泥、水;车间:#3
2 培训 春季培训 2月8日 2月28日 课程:生产砖头;对象:
全体员工;培训级别:3
3 销售 红色风暴行动 2月10日 3月25日 片区:西南、东北、东南、
中南、华北
……
寻开心 2005-02-22
  • 打赏
  • 举报
回复
class Base
{
public:
int m_nType; // 不同类型的标志
virtual Method1() = 0; // 对外一致的方法一
virtual Method2() = 0;
}
class Type1 : public Base
{
public:
Type1() {m_nType=1;};
int m_nPrvate1;
virtual Method1();
virtual Mehtod2();
};

CArray<Base*, Base*> baseManager;
在这里同意处理各个对象

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧