我试图在这里实现的情况是一个基类,它有一个函数(我们称之为modify_command),它可以虚拟地接受许多不同的类型,所以派生类可以实现他们认为合适的modify_command函数。 现在我有沿着这些线路中的基类的东西:C++设计:重载/覆盖很多很多功能,清理的方法?
class Base
{
template<typename Command>
void modify_command(Command cmd)
{
std::cout << "Modify command called with unimplemented command type:" << typeid(cmd).name();
}
virtual void modify_command(SpecificCommandA cmd)
{
modify_command<SpecificCommandA>(cmd); // Calls the templated function
}
virtual void modify_command(SpecificCommandB cmd)
{
modify_command<SpecificCommandB>(cmd); // Calls the templated function
}
// etc.
};
然后在派生类中:
class Derived : public Base
{
virtual void modify_command(SpecificCommandA cmd)
{
cmd.x = 1;
cmd.y = 2;
}
}
显然,一个虚拟模板函数的可能性也不大所以在某种形式的我将必须列出许多参数可能性的众多函数声明,这些可能性肯定会使类定义混乱,并且可能会使其他命令类型难于处理(随着时间的推移)
使模板编辑功能是针对这种情况,而无需modify_command(SpecificCommandC)的定义编译记录一个错误:
Base * base = new Derived();
SpecificCommandA a;
SpecificCommandB b;
SpecificCommandC c;
base->modify_command(a); //Set's x and y
base->modify_command(b); //Outputs that command type is unimplemented
base->modify_command(c); //Outputs that command type is unimplemented
我真的很讨厌我怎么会有这方面的工作,没有任何人有一个建议就如何能够清理/重新实现?随着软件的成熟,命令的数量将继续增长,因此可扩展性是必须的。
编辑:语法
使用成员函数创建SpecificCommand基类,例如onModifyCommand,其中modify_command调用。 – kfsone
@kfsone我不确定我明白你的意思。我的派生类中的每一个都会以不同的方式修改命令(有时根本不会)。这将如何让我的Derivations能够指定它自己的修改命令的实现? – mascoj
看来你想要一个虚拟模板函数的等价物,而不必将派生类中的所有特定重载声明为基类中的虚函数。请确认 – EdMaster