前言
怎样做类
引入
从面向过程到面向对象,需要有个适应的过程.
面向过程注重的是怎样实现目的,即逻辑的具体化,数据化.
面向对象在意的是设计,怎样建立合理的产品结构.
两者本质上没有区别,最后编译完都是0和1
面向对象的三大特征:继承,封装和多态. 目的只有1个:代码重用,适合大型程序的编写.而这三大特征都是以类的形式出现的.
面向过程和面向对象的比喻
打个比方:你想粉刷墙壁,你可能会做以下事情:
1> 网上搜索刷墙的教程,买腻子粉,买油漆,先刮腻子粉,再用油漆调色,最后上漆.-----这是事必躬亲,每一步都自己把握,这是面向过程,这是C语言的设计思想
2>你找个漆匠给你刷墙----这是面向对象.并且是"纯面向对象",这是Java的设计思想
3>你自己也会刷墙,你培训了漆匠给你刷,关键部分亲自出马---这是面向对象,这是C++设计思想
经此一对比,面向对象的优劣就出来了. 面向过程的语言编程困难,但效率高,发挥空间大;面向对象的编程相对简单,但你可能根本不知道发生了什么,按部就班就行了,根本不需要知道到底发生了什么.C++兼具了两者优点,C++的语法繁琐是公认的,语言只是工具,选择适合自己的部分使用,能达到目的就行了.部分内容比如多重继承,私有继承可以选择学习.
类
类的概念类似于"分门别类"里的"类". 表示事物的种类.
有时候感觉太熟悉的东西反而不好去做定义.对"类"的理解,可以想这句话:
同类事物拥有同样的特征,不同类的事物有不同特征.以 "特征"区分不同类.
在面向对象概念里,"对象"是上面的"漆匠",表示可以做某些事的人.漆匠类表示漆匠的模板.类是对象的模板
类的内容
属性和方法. 通常属性声明为private, 方法视情况用public或者protect,表明继承关系可用或公开.方法可以用private修饰,但意义不大.
抽象基类只有虚方法,且不能生成对象,和Java的抽象类概念一致.可以在抽象基类中添加属性
类的分类
笔者将类分为两大体系: 资源类体系和能动类体系.
资源类体系里的类有 资源类,适配器类,效果类.
能动类体系里的类有 数据类,,动作类.
两者区别在于:能动类类体系里的数据类定义了动作,动作类里传入数据类引用.
资源类体系里的资源类没有动作,只能被操作从而实现效果.
举例:能动类系列---数据类,定义了动作:刷墙
class Painter{ //漆匠类定义
private:
string name;
int age;
int height;
public:
Painter(string na,int ag,int he); //构造函数
void paint(); //刷墙
}
非操作类系列---动作类,引入漆匠引用
class Paint{ //刷漆类定义
private:
&Painter painter;
public:
Paint(&painter pa); //构造函数,把漆匠找来
void paint(){painter.paint}; //刷墙,调用漆匠自己的动作
}
说明:似乎有些麻烦,但这样定义的好处是方便接口使用.
资源类体系的类定义,稍微麻烦一点,将在下一话说明.在做图像的程序中用得比较多