无需看代码,通俗解释封装、继承、多态。
类的封装、继承、多态三个概念,要想说清楚,通常都需要使用代码,这样会更到位。
如果没有编程语言的基础,要明白这几个概念也是可以的,让我们根据一个实际的例子来具体说明。
在接下来的例子中会有三个类:电水壶类、保温电水壶类、电茶壶类。
假如徐老师有间公司,销售的产品是电水壶,这种电水壶有这些主要特点:
1 由壶体和壶盖组成;
2 颜色是银白色的;
3 有一个开关可以控制启动烧水;
4 水烧开后会发出声音提醒。
按照面向对象的设计方法,把这个电水壶称为「电水壶类」,按照类表达方式:
1 有两个成员变量:壶体和壶盖;
2 有一个成员属性:颜色,它的值等于银白色;
3 有一个成员方法:烧水;
4 有一个成员事件:水已经烧开会提醒
其中变量用来存储类中的数据,属性用来表达或修改类的特征,方法用作执行类的功能,事件用来对外发送通知,类就是记录一系列变量、属性、方法、事件成员的集合。
所有具有这些特征成员的具体产品就叫做这个类的对象,这就是面向对象的程序设计理念来由。
用前面的例子来讲,「电水壶类」是电水壶的产品设计规范,可以理解为这是电水壶的抽象,而具体的单个电水壶产品就是「电水壶类」的对象,通常叫做类的实例。
以上这些描述的就是类的封装。

假设某一天,公司想生产一种具有自动保温功能的电水壶,有两种方案:一是完全重新设计一个新的电水壶,二是在现有电水壶的基础上增加一个保温开关。
显然,第二种方式更经济,公司把这种新的电水壶称为保温电水壶,它增加了一个特点:增加了一个保温开关,按下开关后可以对已经烧开的水进行自动保温。按照前面的设计方法,由于新电水壶增加了一个成员,所以不能把它归纳到已有的「电水壶类」里面,但是我们可以建立一个新的类:「保温电水壶类」,它在「电水壶类」的基础上增加了一个新成员方法,就是保温,他提供的功能是按下开关就开始保温。
由于它基于「电水壶类」设计而来,因此我们把「电水壶类」称为「保温电水壶类」的基础类或父类,把「保温电水壶类」称为「电水壶类」的继承类或子类,它们之间是继承与被继承的关系,继承类自动具有基础类的所有特征成员。
我们可以把「保温电水壶」称为「电水壶」,但是不能把「电水壶」称为「保温电水壶」。假设客户要买100个「电水壶」,产品数量不够时我们可以用「保温电水壶」来充数,但是客户要买100个「保温电水壶」就绝对不能用「电水壶」来充数。
从程序设计的角度来讲,就是可以把一个数据类型为「保温电水壶类」的对象赋值到一个数据类型为「电水壶」的变量,但是不允许把一个数据类型为「电水壶」的对象赋值到一个数据类型为「保温电水壶类」的变量。
需要注意的是如果把一个数据类型为「保温电水壶类」的对象赋值到一个数据类型为「电水壶」的变量,那么这个变量里面实际存储的还是一个「保温电水壶类」对象,并不会因为变量的数据类型为「电水壶」存储进去的对象的数据类型就也为「电水壶」了。
以上这些描述的就是类的继承。

让我们继续假设,有一天公司发现电茶壶的销路要比电水壶好,同样有两种方案:一是完全重新设计新的电茶壶,二是修改现有电水壶的烧水功能,将其改为烧茶。
很显然,第二种方式更经济实惠。通过修改了电水壶的烧水功能,使其去烧茶。
同样,我们需要定义一个名为「电茶壶类」的类,然后定义一个同样名为「烧水」的方法,实现为烧茶,该方法覆盖了「电水壶类」中的原有名为「烧水」的方法,用来烧茶。
这样以后调用「电茶壶类」类的「烧水」方法时,就会改去烧茶,而不会去烧水。
需要注意的是:如果把一个数据类型为「电茶壶类」的对象赋值到一个数据类型为「电水壶」的变量,据前所述,这个变量里面实际存放的还是一个「电茶壶类」的对象,因此如果调用该变量的「烧水」方法,实际上调用的还是「电茶壶类」的烧茶功能。
以上这些描述的就是类的多态。