前言
笔者在本专栏---"数据类型设计"中,将涵盖数据结构,数据类型设计,设计模式(C++)的内容,示例紧贴应用.深入浅出易于理解,有细致的分析,力求读者在掌握这些内容的同时有清晰的思路,获得更大的成长空间.
引入
在Java中,有个类Object称为所有类型的父类,笔者从C++的角度看Object类是如何实现的
回顾面向对象
面向对象有三大特征:封装,继承和多态.面向对象的特点是所有的过程都由某种事物来完成.
站在面向过程的角度去看待什么是程序,程序表达的是"数据类型"和"过程".而面向对象把所有过程的实现都交给某个具体对象.于是在面向对象的设计中,把"对象"表达出来,程序基本上就完成了.
面向对象的优点是容易模块化,程序结构非常清楚.因此在很多领域得到了巨大的应用空间
封装
封装的意思是把某个个体的"特征"和"动作"封装到一个数据类型中.封装是面向对象中最核心的特征.举个例子,设计一个手动档汽车(Manual_Car)的类型,他的"点火"动作有换挡器,离合器,刹车,火花塞这几个部件参与,则可以做以下类型设计
//伪代码,C++
class Manual_Car{
private:
Shifter shifter; //换档器
Clutch clutch; //离合器
Brake brake; //刹车
Spark_plug sp; //火花塞
public:
Manual_Car(); //构造函数(略)
//汽车启动
starts(){
shifter.neutral(); //换档器挂空档位
clutch.pedal(); //离合器踩下
brake.step(); //踩下刹车
sp.ignite(); //点火
shifter.one(); //换档器挂1档
clutch.lift(); //离合器抬起
};
}
而换挡器,离合器,刹车,火花塞的类型设计,包括各自的"特征"与"动作",单独完成.
=============================内容分割线↓===================================
题外话:事物是在不断进化的,假设手动档汽车的设计改变了,应该如何应对呢?
1>大幅度改动,原有"部件"很多不用了.这种情况可以推倒重来
2>逐步改动,有些"部件"一直用,有的不用了.
解决方案:可以把所有的数据以指针形式传入,例如Shifter * shifter;.这样有了灵活的选择,在构造函数中需要的"部件"赋值指针,不需要的指空.
如果改动过程中有新部件加入,可以用派生类,使用继承(extend)特性解决.
=============================内容分割线↑===================================
继承和多态
继承和多态是"一体两面",放在一起更好理解.
继承
继承有两大特性:增加和修改.
增加---当类B继承类A时,A的"特性"和"操作"B自动拥有,同时B可以增加新的特性和操作.
修改---当类B继承类A时,A的函数可以由B的同名函数重新定义,且A的函数可由B调用.
例如:
//伪代码,C++
class A_father{ //基类(父类)
private:
DataType1 dt1; //一个DataType1类型的对象
public:
A_father(); //构造函数(略)
void fun(); //一个叫fun的函数
}
class B_son:public A_father{ //派生类(子类)
private:
DataType2 dt2; //增加:一个DataType2类型的对象
public:
B_son(); //构造函数(略),应传入一个父类属性的对象dt1
void fun(){ //子类同名函数,在此修改原功能,增添内容
A_father.fun(); //可调用父类函数
dt2.fun(); //把增加的属性的方法添加进来
... //其他内容
}
}
多态
多态理解为多种形态.在继承关系中,每个派生类(子类)对象都是基类(父类)对象的一种形态.
多态存在的语法基础有两个:
1>基类对象引用可以指向派生类对象
2>基类对象指针可以指向派生类对象指针
对于上面的例子,有下面几句代码成立:
//接上一段代码,假设构造函数中没有参数传入
A_father af(); //生成基类对象af;
B_son bs(); //生成派生类对象bs;
&af=bs; //基类引用指向派生类对象
A_father * ptr1 = new A_father ();//生成基类对象,并用ptr1指向他;
B_son* ptr2 = new B_son(); //生成派生类对象,并用ptr2指向他;
ptr1=ptr2; //基类对象指针指向派生类对象指针;
多态的应用
形参使用基类引用或者基类指针,传参数时使用派生类对象或者派生类指针.他的好处是不用更改大量的代码即可完成重新设计.用一个比喻:父类引用或者指针做招牌,实际做事的是子类对象.在设计模式中,有一种"桥接模式"是多态的典型用法.
小结
面向对象的基础内容
885

被折叠的 条评论
为什么被折叠?



