VC++开发GIS系统(30)关于鼠标左键的联想2(C++中的类和对象)

在上文VC++开发GIS系统(29)关于鼠标左键的联想1中我介绍了教程进行到现在遇到了一个重要问题,在文章最后我介绍了解决这个问题的方法:面向对象。在本文中我将介绍怎样使用面向对象的方法来解决所遇到的问题。需要说明的是,本教程并不是一系列的C++教程(尽管其实写完了这个程序会对C++面向对象的理解更加深刻),所以在介绍相关C++知识的时候可能只是从方法和概念上说明,具体的代码实现就不会赘述了,若有不懂可以留言,或者参照郑筣或者谭浩强老师的教材。

关于C++类和对象的几个概念回顾

对象

客观世界中任何一个事物都可以看成一个对象(object),对象可大可小。对象是构成系统的基本单位。任何一个对象都应当具有这两个要素,即属性和行为,它能根据外界给的信息进行相应的操作。一个对象往往是由一组属性和一组行为构成的。一般来说,凡是具备属性和行为这两种要素的,都可以作为对象。在一个系统中的多个对象之间通过一定的渠道相互联系,相互传送相应的消息。

使用面向对象的程序设计方法设计一个复杂的软件系统时,首要的问题是确定该系统是由哪些对象组成的,并且设计这些对象。在C++中,每个对象都是由数据和函数这两部分组成,数据体现了前面提到的“属性”如一个三角形对象,它的3个边长就是它的属性。函数是用来对数据进行操作的,以便实现某些功能,例如可以通过边长计算出三角形的面积,并且输出三角形的边长和面积。计算三角形面积和输出有关数据就是前面提到的行为,在程序设计方法中也称为方法。调用对象中的函数就是向该对象传送一个消息,要求该对象实现某一行为功能。

封装与信息隐蔽

可以对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,也就是说从外界是看不到的,甚至是不可知的。这样做的好处是大大降低了操作对象的复杂程度。面向对象程序设计方法的一个重要特点就是“封装性”,指两方面的含义: 一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽,信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。C++的对象中的函数名就是对象的对外接口,外界可以通过函数名来调用这些函数来实现某些行为。

抽象

在程序设计方法中,常用到抽象这一名词。抽象的过程是将有关事物的共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。C和C++中的数据类型就是对一批具体的数的抽象。对象是具体存在的,如一个三角形可以作为一个对象,10个不同尺寸的三角形是10个对象。如果这10个三角形对象有相同的属性和行为,可以将它们抽象为一种类型,称为三角形类型。在C++中,这种类型就称为“类”。这10个三角形就是属于同一“类”的对象。类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。

继承与重用

如果在软件开发中已经建立了一个名为A的“类”,又想另外建立一个名为B的“类”,而后者与前者内容基本相同,只是在前者的基础上增加一些属性和行为,只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制。利用继承可以简化程序设计的步骤。“白马”
继承了“马”的基本特征,又增加了新的特征(颜色),“马”是父类,或称为基类,“白马”是从“马”派生出来的,称为子类或派生类。C++提供了继承机制,采用继承的方法可以很方便
地利用一个已有的类建立一个新的类。

多态性

如果有几个相似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。如,在Windows环境下,用鼠标双击一个文件对象(这就是向对象传送一个消息),如果对象是一个可执行文件,则会执行此程序,如果对象是一个文本文件,则启动文本编辑器并打开该文件。

在C++中,所谓多态性(polymorphism)是指: 由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。

废话说了这么多,怎么解决?

好了,也不绕关子了,放出终级代码:

class MalaBaseAction
{
public:
  MalaBaseAction();
  virtual ~MalaBaseAction();
  virtual void LButtonDown (UINT nFlags, CoPnt point);
  virtual void LButtonUp (UINT nFlags, CoPnt point);
  virtual void RButtonDown(UINT nFlags, CoPnt point);
  virtual void RButtonUp(UINT nFlags, CoPnt point);
  virtual void MouseMove(UINT nFlags, CoPnt point);
  virtual void MouseWheel(UINT nFlags, short zDelta, CoPnt pt);

  CView* m_ptView;
};

这段代码就是整个解决问题的核心了,创建一个基础的类,里面封装了关于鼠标的各种操作(使用的虚函数的方法),在下面的教程以及开发中,所有关于鼠标的操作都将基于MalaBaseAction派生,并将派生的对象赋值给基类,这样基类调用相应的操作(如LButtonDown )就会执行特定的派生类中的实现了(这就是多态啊!)

关于代码开源

首先代码当然要开源,不仅仅是本程序,包括我之前写过的一些示例也会开源,有朋友问我说能不能把代码共享一下,在后面的程序中我会把相关的代码及时公开在Coding上面(github国内访问有点问题。)

地址:https://coding.net/u/yqc/p/malagis-desktop-prj/git

VC++开发GIS系统(29)关于鼠标左键的联想1 VC++开发GIS系统(31)VC++开发GIS系统的整体规划

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论