前面我们讨论了在定义抽象数据类型的时候应该如何去考虑,总结出了一点:用户使用及类型语义为导向进行设计。
这堂课我们将以一段好玩的代码来继续我们的类设计(代码已经发送到群邮件中)。
我给出了VC2005和VC2008的两个版本的工程,bin目录下是已经编译好的程序。如果没有这两个版本的IDE的话,那么可以用代码文件重新创建工程,并进行设置:
工程为win32应用程序工程,工程使用预编译头,将stdafx.cpp设置为创建预编译头。
本堂课的重点在于Ball.h和Ball.cpp这两个文件中的内容,其他代码是用来创建窗口的,不用仔细阅读。
我们定义了个类,叫做Ball。这是个表示球的类(这里的球的概念等同于平面的椭圆)。
用户使用导向:显示一个窗口,并在窗口中绘制一个移动的球,并且这个球超出了窗口范围会自动弹回。从这里我们可以得到的信息是:需要一个窗口对象、一个球对象。窗口负责绘制球,并控制球的位置,那么我们的球应该具备一个绘制接口和一个设置位置的接口。
类型语义导向:球应该具有宽度和高度(尺寸),绘制在窗口应该具有一定的颜色。那么我们的球还应该具备设置尺寸的接口和设置颜色的接口。
从以上得到的信息,我们就可以设计我们的球类了:
思考Ball的拷贝和赋值语义:Ball类对象拷贝构造,得到的是已有的Ball类对象的位置和颜色信息,赋值也一样,那么默认的拷贝构造和赋值操作的行为是符合其语义的,那么我们就不用再去实现了。
使用者在调整Ball的位置的时候,通常想要参考其原来的位置,那么我们应该提供一个获取小球当前位置接口。同理也应该提供一个获取小球当前颜色的接口。
对于球在窗口内进行移动和反弹的效果不是我们这堂课的主题,有兴趣的可以阅读TestWindow这个窗口类中的OnTimer中的代码。
语音课堂上我们接着讨论如何去修改和扩展这个Ball类,让它能够满足我们更多的需求。