考虑以下类:
class MyClass1
{
public:
double x() const {return _x;} // getter
double y() const {return _y;} // getter
double z() const {return _x*_y;} // getter
void x(const double var) {_x = var;} // setter
void y(const double var) {_y = var;} // setter
void z(const double var) {_x = var; _y = 1;} // setter
protected:
double _x;
double _y;
};
由于 的实际内容MyClass1
是一个实现细节,因此 getter 和 setter 提供了一种统一的方式来获取和设置类内容,即使它们是相互依赖的(这里_z
不存在内部但对用户而言,z
是一个变量,如x
and y
)。
现在为了避免必须为x
and编写 getter/setter y
,可以使用这样的包装器:
template <typename Type>
class Wrapper
{
public:
constexpr Wrapper(const Type& value) {_value = value;}
constexpr Type& operator()() {return _value;}
constexpr const Type& operator()() const {return _value;}
constexpr void operator()(const Type& value) {_value = value;}
protected:
_value;
};
现在原来的类变成了:
class MyClass2
{
public:
Wrapper<double> x;
Wrapper<double> y;
double z() const {return x*y;} // getter
void z(const double var) {x = var; y = 1;} // setter
};
避免编写 getter/setter 是一种危险的做法还是一个好的解决方案?
注意:这里MyClass1
和MyClass2
只是例子。我的问题非常“笼统”:Wrapper
当 getter/setter 只是返回/设置一个内部值时,用提议的方法替换类的 getter/setter 是否危险。