接口更改:为抽象c++方法添加新参数
interface changes: add new arguments to abstract c++ method
我们有一个大型软件框架,在代码的繁重部分,我们有一个抽象基类,说
class Base {
public:
virtual double eval() const = 0;
};
在很大程度上充当了许多其他类的公共接口类,这些类分布在不同的子包中,驻留在不同的存储库中等等。
class Derived1 {
public:
virtual double eval() const override { return 1; }
}
然而,在我们的代码中实际上只有一个地方调用了这个函数,那就是在核心应用程序的主循环中。
int main(int argc, char* argv[]){
Base* x = createInstance(argv[1]); // some factory function
while(true){
std::cout << x->eval() << std::endl;
}
}
我们最近发现扩展这样的接口是非常有用的:
virtual double eval(int idx) const = 0;
在核心应用程序中修复对该方法的一个调用不是问题,但是修复分布在我们代码中的数十个现有派生类实现来接受和(在大多数情况下)忽略这个新参数将是一场噩梦。
我考虑过提供一个像这样的遗留包装器:
double Base::eval(int idx) const { return this->eval(); }
但这意味着所有派生类都需要实现该函数的无参数版本才能存在,即使它应该被弃用。或者,我们可以实现非参数版本作为Base
的一部分,但这样我们就会牺牲Base
的抽象性质,因为这样所有组件都已经在那里实现了。
是否有任何"整洁"的方法来解决这个问题,或者唯一相同的事情是实际联系所有的子包开发人员,让他们改变他们的实现来坚持新的接口?
可以用double eval(int idx)
添加一个新的抽象基类New
,而弃用旧的。
当您让一个继承另一个时,您可以编写接受New
的新api,并且它们与Old
保持兼容。
struct New
{
virtual ~New() {}
virtual double eval(int idx) = 0;
};
struct Old : New
{
virtual double eval() = 0;
virtual double eval(int idx) { eval(); } // backwards-compatible
};
实现New
的人被强制覆盖一元函数,而实现Old
的人被强制覆盖旧的,非一元函数。
或者,我们可以将非实参版本实现为Base的一部分,但这样我们就会牺牲Base的抽象性质,因为这样所有组件都已经在那里实现了。
您可以将一个接口用作转换接口(两个接口都有),或者您可以创建两个接口,本质上是将人员转换到第二个接口。这使主循环变得复杂,但使类实际上保持抽象。
你可以这样做
class Base {
public:
virtual double eval() const{}
virtual double eval(int idx) const{
this->eval();
}
virtual ~Base() = 0;
};
Base::~Base(){}
并在派生类中实现eval()
或eval(int idx)
。
实现的纯虚析构函数确保Base
类不能被实例化。(见https://stackoverflow.com/a/14631710/2186392)。
- 如何使用主参数添加更多堆栈?
- 将新元素添加到列表中,并返回对该元素的引用?
- 在C++中,如何将参数添加到"Args&&... args"参数列表中?
- 我如何将4个以上的参数添加到MIPS中的一个函数
- 如何在 c/c++ 中为参数添加选项?(视觉工作室平台2019)
- 将新值添加到链表中
- QML ListView将新行添加到模型中的子向量
- 将功能参数添加到向量
- 将参数添加到q_object构造函数
- 使用模板参数添加数据
- 将新元素添加到动态数组C
- 推送功能(将新节点添加到列表顶部)C
- 如何将模板函数指针作为值参数添加到地图中
- 在指向另一个宏的可变参数宏中为每个参数添加前缀
- 如何防止 clang 格式向新行添加单个分号
- 基于模板参数添加成员函数和成员变量
- 仅当数组属于特定类型时,才将模板化参数添加到数组
- 删除前面元素并将新元素添加到最小堆 (std::p riority_queue)
- 接口更改:为抽象c++方法添加新参数
- 在SW版本中添加新参数时如何处理"switch/case"