继承和多态

1 泛化
泛化是一般元素和特殊元素之间的关系,是将多个特殊元素中的公共特征或行为提取出来而形成一般元素。
可替换性原则是,在使用一般元素的任何地方都可以使用特殊元素来代替,因为特殊元素除了拥有自身所有的特征和行为外,肯定拥有一般元素的所有特征和行为。
类泛化是类之间最高层次的依赖。类泛化的过程是将多个具有相同属性和操作的特殊类中的公共部分提取出来而形成特殊类的一般类,即超类。与泛化过程相反的是特化过程,特化过程是在分析过程中首先识别具有公共特征的一般类,再根据其特殊类型来向一般类中加入特殊类所特有的特征而产生特殊类,即子类。
如图1所示,从下层到上层的过程是泛化过程,而从上层到下层的过程是特化过程。可以认为,正方形(Square)是图形(Shape)的一种,而正方形(Square)、圆形(Circle)和矩形(Triangle)都是图形(Shape)。

图1
2 类继承
如图1所示,正方形(Square)、圆形(Circle)和矩形(Triangle)继承了图形(Shape)的所有特征,而形成了类的层次。
子类完全继承超类的属性、操作、关系和约束。
2.1 覆写
操作的签名:操作的名称、返回类型和按照顺序列出的参数类型,不包括参数的名称。也就是说,只有在操作具有相同的名称、返回类型和相同的按照顺序列出的参数类型的时候,才拥有相同的签名。
覆写是子类对超类中的具有相同签名的操作的实现和再次实现。实现的情况用于超类的相应操作是抽象操作,再次实现则是对超类中已实现的具体操作的改写。
当覆写具体操作时,必须小心。通过事先检查超类操作的规格说明,保证你遵守了它的契约,否则对已有的具体操作的改写将引起严重后果。通常的做法是,子类操作仅做一些额外事情,然后调用超类的操作。
2.2 抽象操作和类
有时在一个类中并不需要实现一个操作,而仅仅是声明它,说明其是其子类的公共特征之一,而在子类中延迟实现这个操作,这种操作就是抽象操作。拥有抽象操作的类被称为抽象类。
抽象类不能被实例化,因为抽象操作可以认为是一个概念性的事物,实际并不存在于抽象类中,当然它就是不可被使用的。

图2
如图2所示,在图形(Shape)中有二个用斜体表示的抽象操作,而在正方形(Square)和圆形(Circle)实现了它们。
2.3 抽象层次
泛化层次定义了从顶层最一般到底部最特殊的一组抽象层次,在同一泛化层次中的类,其抽象层次也是相同的。
2.4 多重继承
如果一个类具有多于一个的超类,就是多重继承,子类继承所有它的直接超类。如图3所示:
图3
3 多态
多态操作是具有多种实现的操作,如图2所示,图形(Shape)中的二个抽象操作draw()和getArea()具有正方形(Square)和圆形(Circle)中二种不同的实现。多态的本质是不同类的对象具有相同签名的操作,但实现即不同。
契约,一组抽象操作是定义所有具体子类必须实现的一组操作的方法。
在使用超类某个抽象操作的地方使用不同的子类的不同实现,其产生不同的结果,这就是多态。
如图4所示,类Canvas维护Shape的集合。

图4
多态的示例如图5所示。
图5
当Canvas向不同的Shape的对象发送消息draw()时,各对象将会画出不同的图形。
相同类的所有对象响应相同的消息,调用相同的操作,但这并不是说,相同类的所有对象以完全相同的方式响应相同消息。操作调用的结果常常依赖于对象的状态--所有属性值和所有关系的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值