我有一个接口类MyFunction.此类中有三个函数,具有以下签名:
virtual bool Eval(int& iReturnVal, size_t szArgumentCount, list<Param> lParameterList) = 0;
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList) = 0;
virtual bool Eval(char*& zReturnVal, size_t szArgumentCount, list<Param> lParameterList) = 0;
Run Code Online (Sandbox Code Playgroud)
现在,任何实现MyFunction只需要实现其中一个函数,具体取决于它需要返回什么类型的值.但即使其他两个函数是这样的,我也必须实现所有3个函数:
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
Run Code Online (Sandbox Code Playgroud)
哪个看起来不那么好.或者,我可以在界面中声明这样的所有三个函数:
virtual bool Eval(int& iReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
virtual bool Eval(char*& zReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
Run Code Online (Sandbox Code Playgroud)
这看起来也很难看.这两个中不那么丑陋的是什么?或者有更好的方法吗?
编辑:
关于D Krueger的方法:
#include <iostream>
using namespace std;
class Base
{
public:
template<typename T>
void F(T){cout << "Type T" << endl;}
};
class Imp : public Base
{
public:
template<int>
void F(int){cout << "Type int" << endl;}
};
int main(int argc, char** argv)
{
Base* pB;
Imp oI;
pB = &oI;
pB->F(1);
}
Run Code Online (Sandbox Code Playgroud)
看起来专业化虽然派生,但不适用于各类.由于模板功能不能是虚拟的,这似乎是一种无望的情况.
当实现接口的类不需要其中的全部方法时,这表明您的接口设计可能需要重构。也许你可以把这个接口分成3个接口。
另一种可能性是从中创建一个包装器接口,它返回不需要的 2 个方法的默认值。但在这种情况下,您最终也会得到 3 个接口(原始父接口 -> 总共 4 个接口)。如果您无法更改原始界面,则此解决方案是可以接受的。
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |