继承

解释一个新的东西最好的方法是从旧的东西开始。如果您的听众已经知道什么是“帆船”对您解释什么是“斯库纳纵帆船”非常有帮助。如果您想解释一下拨弦键琴是怎么工作的,最好的情况是您的听众已经知道钢琴的内部构造,或者看见过吉他是怎么演奏的,至少,熟悉某种乐器。

定义一个新类也一样,如果能够从现存的类开始,一切都会更加简单。

为此,面向对象的编程语言允许您基于一个现存的类定义一个新类。现存的类被称作父类;新类被称作子类。子类只需要定义和父类不同的部分。

子类并非从父类拷贝而来,而是继承了父类的所有方法和实例变量。如果子类的定义是空的(没有定义任何自己的变量和方法),这两个类将是一样的(除了类名)并且共享同一份定义。这就和"fiddle"和"violin"都是表示小提琴一样。然而,定义新类的目的并不是生产同义词,而是因为子类至少有些东西和它的父类不同。
本节将包括如下内容:

类的继承体系
子类的定义
继承的使用

类的继承体系

任何类都可以作为一个新类的父类,也可以是一个类的子类同时是另一个类的父类。在继承体系中类的数目并没有限制,如图3-3所示:


图 3-3 继承体系

每个继承体系都是从一个没有父类的根类开始向下衍生的。每一个类都继承自它的父类,并通过父类,继承了父类的父类,以此类推,每个类都继承了根类。

每个类都是它的继承链上所有类的定义的累积。如上所示,D继承自父类C和根类,因此D拥有三个类D,C和root定义的所有方法和实例变量。

通常,一个类只有一个父类和任意数目的子类。然而在某些面向对象的编程语言(尽管不是Objective-C)中,一个类可以继承自多个父类。和图3-3中继承体系只能向下衍生不同,多重继承可以有几个继承链最后合并为一个,这几个继承链可以来自不同继承体系(继承自不同的根类)。
子类的定义

子类通常从三个方面对父类的定义做出改动:
子类可能通过增加新的方法和实例变量来扩展父类的定义。通常这是需要定义子类的一个最主要的原因。子类总是有一些新的方法,或者新的实例变量。
子类通过替换继承自父类的方法来更改该方法的行为。通常,子类简单的实现一个和父类同名的新方法,从而覆盖了父类的方法(父类的方法并没有消失,其它的类从父类继承的时候仍可以使用该方法)。
子类可能扩展父类的方法但仍然保留着父类方法的行为。子类可以用一个新的方法覆盖父类的方法,然后在新方法中先调用父类的方法,然后再进行子类自己的处理。继承链中的每个类都会构成方法行为的一部分。例如在图 3-3中,D中的一个方法行为可能既包含C的处理行为,同时也包含了根类的处理行为。

通过以上的改动,子类相对父类而言变得更具体化和特殊化。子类一般会增加或者替换父类代码实现而不是减少代码。注意,通常方法不能被禁止继承,并且不能移除或者覆盖实例变量。
继承的用法

关于继承体系比较经典的例子就是动植物分类。例如,松科的子类可能有冷杉,云杉类,松树,铁杉,美洲落叶松,花旗松。松树的子类有软松,硬松。软松的子类又有白松,兰伯多松,硬松的子类有西黄松,斑克松,辐射松,红松。

在实际中很少有程序如此分类,但是用来作例子分析类的继承很合适。 子类一般都是对父类做一些定制,或者对父类进行某方面的扩展,以达到一些特别的目的,而不是为继承而继承。

下面是继承几种典型的用法:
代码复用。如果两个类有部分相同的代码,那么相同的部分就可以放在一个独立的类中,让其它的类来继承它,从而相同部分的代码只用实现一次。

例如,水龙头,阀门和管道类,都需要连接到水源并且记录水流的速度。这些共同部分可以在一个公共类中实现,水龙头,阀门,和管道类分别继承这个类。水龙头从某种意义上说也是一种阀门,所以水龙头类可以继承自阀门类,然后加上水龙头的属性。
创建协议类。一个类可以声明一些方法并要求子类实现这些方法。该类可能声明了一些空的方法,或者只有初步实现的方法。无论那种情况,我们都可以认为,该类为它的子类建立了一种协议。

当不同的类可能会实现同名的方法时,程序最好采用多态的设计。构造一个协议类来让子类继承是一种很好的习惯做法。
通用性功能的发布。程序员可能定义了一些基本的,通用的,能解决某方面问题的类,但是这个类没有处理各种细节。其它的程序员可以创建一个继承这些类的子类来满足特定的需求。例如,用水系统建模程序中的装置类,程序可能会定义一个通用的用水设备类,然后创建继承自该类的装置子类,在子类中返回具体的设备类型。

继承能够帮助程序员减少工作量,并且有助于分层实现。
需要对现有逻辑作一些轻微的改动。在上述的用法中,都是设计一个类来让其它的类继承。但是,您也可以继承一个不是设计用来作父类的类。例如,有个类在您的程序中工作得很好,但是您想修改其中得某些函数,您就可以继承这个类,并在子类中做出修改。
功能预览。子类可以帮助我们进行选择测试。例如,如果一个类设计了一个特定的接口,则在子类中可以设计另外一套接口。每个接口都向用户开放,由用户选择喜欢的接口,并把它合并到父类中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值