1.6 什么不是类
C++面向对象高效编程(第2版)
理解何时不能将某些部分设计成类也非常重要。将函数组合到一起是把模块(或者把简单的C头文件)转化为类的效果,这不是真正的类。其实,只需从模块中取出函数,并让它们成为公有成员函数,你就拥有了一个类!类并不仅仅是一组函数,它的含义比这多得多。
例如,考虑一个模块,它实现一组数学函数,如开方、求幂、求倒数等。有人可能试图(错误的)将这个模块转换为MathHelper类。
class MathHelper {
public:
double Sqrt(double aNumber);
double Power(double aNumber, int raiseTo);
double Inverse(double aNumber);
private:
// 一个私有数据也没有!
};```
这里的问题在于,MathHelper类的内部没有任何数据需要管理。客户调用一个成员函数,并为其提供实参,成员函数利用客户所提供的实参完成必要的计算。但是,在计算时,成员函数无需类的帮助,类中也没有任何数据供成员函数使用。函数只是简单地组合到一起(没有必要),它们没有共同点。这样的类包含的是一组函数(代码),没有数据。较好的方案是创建Number类,并为Number类提供操作。
![image](https://yqfile.alicdn.com/d6d00469858f65cabde2732403240ab2ac063240.png)
图1-4
class Number {
public:
Number Sqrt();
Number Power(Number raiseTo);
Number Inverse();
Number Absolute(); // 计算绝对值
private:
// 内部表示,用于存储数字
};`
在这种情况下,Number类控制了数字的内部表示。因为客户并不了解这些内部表示,所以从逻辑上讲,是类提供了所需的操作。
进一步分析这个设计,我们可以构思一个继承层次,用于代表不同类型的数字(实数、整数、复数等)。这些类型可以成为Number的派生类(或子类),如图1-4所示。
继承将在第5章和第6章中讨论。
类似地,一个C“结构”不能直接成为一个类。不能将结构修改成类,让所有数据成为私有数据,然后添加一组函数来获得和设置数据成员,这不是类。类不只是一组允许客户获取和设置数据成员值的函数。数据封装隐藏了类中的数据,而且通过成员函数提供更高层次的抽象。如果只是让函数读写结构中的数据,其实并未简化任何东西。只包含获值函数(getter)和设值函数(setter)的类是糟糕的设计1。
时间: 2024-09-21 18:56:27