人老是很忙的,可是一我的就是一我的,不存在分身术。编程
假设有我的王大柱,他是光明中学的校长,仍是光明村的村委会成员,同时仍是他儿子的父亲。设计模式
那么咱们能够这么想:王大柱是一个类的具体的实现对象,这类名叫“王大柱类”,而王大柱类实现了三个接口:“I光明中学校长”、“I光明村村委会成员”、“I父亲”。spa
画图以下:设计
那么咱们能够称这三个接口为这个类的三个“身份”。指针
咱们能够这样制造一个王大柱出来:code
王大柱类 王大柱 = new 王大柱类();
此时,“王大柱”这个变量就表明了[王大柱类]的实例。这个没问题吧?对象
戏剧性的事情来了。blog
>“王大柱”在学校是什么身份呢?按正常的角度,他应该是校长的身份,管理学校的方方面面才对。继承
>“王大柱”在村委会是什么身份呢?按正常角度,他应该是村委会成员,参与村委会的会议和讨论。接口
>“王大柱”在家里是什么身份呢?按正常的角度,他应该是他儿子的父亲,在家带孩子陪老婆。
因此接下来的代码你们看仔细了:
// 王大柱要以校长身份去开师生会议 I光明中学校长 王校长 = 王大柱 as I光明中学校长; 王校长.召开师生会议();
咱们知道,接口能够定义变量,也能够实例化对象(用于实例化的类必须实现该接口)。
如今,我用I光明中学校长这一身份,去定义“王校长”这个变量,或者说定义这张工做证,有了这张工做证,“王大柱”这我的,身份就会转化为"王校长",可是"王校长"仍是王大柱,并非第二我的。这就是说,我在上面用关键字new的“王大柱”,在内存(地球)中只有一个对象(人),接口定义的"王校长"这个变量,仅仅指向了wdz这我的,给了他一层校长的身份而已。
以下图:
熟悉C++指针/内存堆栈的同窗必定不陌生,左边就是堆,右边就是栈,堆是真正的数据,而右边的“王大柱”、“王校长”,只是一些变量,真正的数据和变量之间的关系,在这里就是引用关系。
可是接口编程又有一个不一样的特色,也是极为重要的一个特色:接口有本身的成员变量。
换句话说,“王大柱”在家里,不是学校的“校长”,校长给老师和主任发通知的功能就没了呀!难道向老婆儿子发命令?找打。
这就是身份的问题,接口能够为堆上的对象提供不一样的身份,实现不一样的功能。
再来看下面的代码:
// 王大柱要去开会 I光明村村委会成员 王委员 = 王校长 as I光明村村委会成员; 王委员.到村里开会(); // 王大柱要回家作饭给儿子吃 I父亲 王爸爸 = 王委员 as I父亲; 王爸爸.给儿子作饭();
读者能够本身想象了吗?
附:OOP(面向对象编程)三大特征
封装、继承、多态
这三个特征一直持续到编程的“设计模式”及之后更高层次的编程中。