i = i;} -6ren">
gpt4 book ai didi

c++ - 有什么好的方法可以将 "reimplement"非流畅界面转换为流畅界面?

转载 作者:行者123 更新时间:2023-11-30 02:27:02 27 4
gpt4 key购买 nike

我正在寻找的是不流利的类(class):

class NonFluent {
int i=0;
public:
void setValue(int i) {this->i = i;}
void multiplyValue(int i) {this->i *= i;}
int getValue() {return this->i;}
};

我想更改 void 方法以实际返回对 *this 的引用。我知道仅仅派生是不可能的,因为我们不能只改变返回类型,因为 C++ 无法区分函数调用。

我们可以使用组合:

class Fluent {
Fluent& setValue(int i) {var.setValue(i); return *this;}
Fluent& multiplyValue(int i) {var.multiplyValue(i); return *this;}
int getValue() {return var.getValue();}

private:
NonFluent var;
};

但如果有许多 void 方法开始,那就很痛苦了。我们还可以使用对象编辑器,我问了以下问题: Is Object Editor a good approach if there are multiple member functions to call? , 但它有很多缺点。

你知道有什么好的方法吗? (不直接改变非流利类?)

最佳答案

一种可以与 Fluent 一起使用但不能与 NonFluent 一起使用的更好方法是使您的类不可变,并拥有它的方法返回带有修改结果的新对象:

class Fluent {
static Fluent withValue(int i) {
NonFluent v;
v.setValue(i);
return Fluent(v);
}
Fluent multiplyValue(int i) const {
Fluent res(var);
res.var.multiplyValue(i);
return res;
}
int getValue() const {return var.getValue;}
private:
Fluent(const NonFluent& v) : var(v) {}
NonFluent var;
};

注意创建 Fluent 对象的静态工厂方法。

使用工厂的代码如下所示:

int res = Fluent
.withValue(5)
.multiplyValue(2)
.getValue();

这让您有机会重新设计 API 以包含采用其他流畅对象的方法,如下所示:

Fluent multiply(const Fluent& other) const {
Fluent res(var);
res.var.multiplyValue(other.getValue());
return res;
}

总体结果是您的 API 变得对并发友好,而无需更改原始 NonFluent API 中的任何内容。

关于c++ - 有什么好的方法可以将 "reimplement"非流畅界面转换为流畅界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42175437/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com