我的这个多态需求怎样用模板实现?不想用继承。

jiandingzhe 2014-04-17 05:31:09
我在做一个工具包,里面是一些命令行程序,每个程序都有相似的处理过程:
解析命令行参数,
validate参数,
把参数打到屏幕上,
显示”开始运行“,执行一些操作,然后显示”完成“。

现在的实现,是一个App基类,然后每个程序有自己的子类:

class App
{
public:
App();
virtual ~App();
void go(int argc, char** argv);

protected:
virtual void parse_options(int argc, char** argv) = 0;
virtual void validate_options() = 0;
virtual void show_options() = 0;
virtual void execute() = 0;
}

void App::go(int argc, char** argv)
{
parse_options(argc, argv);
validate_options();
if (!OPT_quiet)
{
cout << endl
<< "#---------------------------------#" << endl
<< "#" << endl
<< "# Options:" << endl
<< "#" << endl;
show_options();
cout << "#" << endl
<< "#---------------------------------#" << endl
<< endl;
}

if (!OPT_quiet) cout << "start processing" << endl;
execute();
if (!OPT_quiet) cout << "done" << endl;
}

但是,我觉得这样很傻:
1。引入了没有必要的类。这里的操作是比较”过程“的,OO的成分很淡,所以App类和子类里都没有成员变量。但我却引入了一堆类。
2。我不需要运行时多态,所以不需要基于类、子类、虚函数的那套东西,应当用模板就行。
...全文
140 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiandingzhe 2014-04-20
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
模板同样是要引入一堆“重复”类或者一堆“重复”的函数的。 如果你听说过模板实例化的过程的话。 所以,你对“傻”的定义,定义错了。
进一步用宏来减少重复代码:
#define DECL_APP_CLASS(class_name) class class_name\
{\
public:\
    static void parse_options(int argc, char** argv);\
    static void validate_options();\
    static void show_options();\
    static void execute();\
}
jiandingzhe 2014-04-19
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
网上有个options的库,直接使用吧。
我就是在用boost的program_options。
mujiok2003 2014-04-19
  • 打赏
  • 举报
回复
functor或lambda
mujiok2003 2014-04-19
  • 打赏
  • 举报
回复
网上有个options的库,直接使用吧。
jiandingzhe 2014-04-19
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
模板同样是要引入一堆“重复”类或者一堆“重复”的函数的。 如果你听说过模板实例化的过程的话。 所以,你对“傻”的定义,定义错了。
关键是我不想要运行时多态的那套东西,比如继承、虚函数。 我想出来怎么弄了。应当可以这样,unqualified call一些类方法:

// App.h
template <typename T>
void go(int argc, char** argv)
{
    T::parse_options(argc, argv);
    T::validate_options();
    T::show_options();
    T::run();
}
buyong 2014-04-18
  • 打赏
  • 举报
回复
可以用组合呀,每个新的类不是继承APP,而是使用一个APP对象的指针。
jiandingzhe 2014-04-18
  • 打赏
  • 举报
回复
引用 2 楼 zyaiwx 的回复:
不继承还要多态干嘛?多态是继承基础上出来的概念 多态 概念:同一个实现接口,使用不同的实例而执行不同的操作。 实现步骤: 1、子类重写父类的方法 2、把父类类型作为参数类型,该父类及其子类对象作为参数传入。 3、运行时,根据实际创建对象类型动态决定使用哪个方法。 4、父类引用指向子类对象时注意:该引用只能调用父类自己的方法或者是子类已重写的方法。并且首先实例化父类的构造方法
非也。基于模板的编译时多态也是多态。
zybjtu 2014-04-17
  • 打赏
  • 举报
回复
不继承还要多态干嘛?多态是继承基础上出来的概念 多态 概念:同一个实现接口,使用不同的实例而执行不同的操作。 实现步骤: 1、子类重写父类的方法 2、把父类类型作为参数类型,该父类及其子类对象作为参数传入。 3、运行时,根据实际创建对象类型动态决定使用哪个方法。 4、父类引用指向子类对象时注意:该引用只能调用父类自己的方法或者是子类已重写的方法。并且首先实例化父类的构造方法
taodm 2014-04-17
  • 打赏
  • 举报
回复
模板同样是要引入一堆“重复”类或者一堆“重复”的函数的。 如果你听说过模板实例化的过程的话。 所以,你对“傻”的定义,定义错了。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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