《专题Java语言的接口和抽象类ppt课件》由会员分享,可在线阅读,更多相关《专题Java语言的接口和抽象类ppt课件(20页珍藏版)》请在金锄头文库上搜索。
1、专题:Java言言语的接口和的接口和笼统类 在家里,可以很容易地将一个电器从电源插座上拔下,在家里,可以很容易地将一个电器从电源插座上拔下,然后将另一个电器插上。对于电源来说,这些电器都是可插然后将另一个电器插上。对于电源来说,这些电器都是可插入构件入构件Pluggable Component。它们之所以是可插入的,。它们之所以是可插入的,是由于它们都具有与电源插座相匹配的插头。是由于它们都具有与电源插座相匹配的插头。可插入构件:假设可以动态地将一个构件移走,并以另一个可插入构件:假设可以动态地将一个构件移走,并以另一个构件取而代之,那么这种构件就是可插入构件。构件取而代之,那么这种构件就是可
2、插入构件。 可以看出,所谓的接口,实践上就相当于电源插座;而可以看出,所谓的接口,实践上就相当于电源插座;而可插入构件就相当于与这种插座相匹配的电器。正如电器的可插入构件就相当于与这种插座相匹配的电器。正如电器的可插入性是由一致的电源插座及每个电器都有一个与之匹配可插入性是由一致的电源插座及每个电器都有一个与之匹配的电源插头呵斥的一样,可插入构件的关键在于存在一个公的电源插头呵斥的一样,可插入构件的关键在于存在一个公用的接口,以及每个构件都实现了这个接口。用的接口,以及每个构件都实现了这个接口。 因此,接口是实现构件的可插入性的关键。因此,接口是实现构件的可插入性的关键。什么是接口什么是接口
3、Java Java接口是一些方法特征的集合,没有方法的接口是一些方法特征的集合,没有方法的接口是一些方法特征的集合,没有方法的接口是一些方法特征的集合,没有方法的实现实现实现实现。这这这这些方法在不同的地方被些方法在不同的地方被些方法在不同的地方被些方法在不同的地方被实现时实现时实现时实现时,可以具有完全不同的行,可以具有完全不同的行,可以具有完全不同的行,可以具有完全不同的行为为为为。JavaJava接口本身没有任何接口本身没有任何接口本身没有任何接口本身没有任何实现实现实现实现,由于,由于,由于,由于JavaJava接口不涉及接口不涉及接口不涉及接口不涉及详细详细详细详细,而,而,而,而只
4、描画只描画只描画只描画publicpublic行行行行为为为为,所以,所以,所以,所以JavaJava接口比接口比接口比接口比JavaJava笼统类笼统类笼统类笼统类更更更更为笼统为笼统为笼统为笼统化。化。化。化。一个一个一个一个JavaJava接口的方法只能是接口的方法只能是接口的方法只能是接口的方法只能是笼统笼统笼统笼统的和公开的,的和公开的,的和公开的,的和公开的, Java Java接口不能接口不能接口不能接口不能有构造方法。有构造方法。有构造方法。有构造方法。实现实现实现实现一个共同的一个共同的一个共同的一个共同的JavaJava接口的两个接口的两个接口的两个接口的两个类经类经类经类
5、经常完全不同,但是有一常完全不同,但是有一常完全不同,但是有一常完全不同,但是有一组组组组一一一一样样样样的方法。一些看上去毫不相关的的方法。一些看上去毫不相关的的方法。一些看上去毫不相关的的方法。一些看上去毫不相关的类类类类,可以由于提供相,可以由于提供相,可以由于提供相,可以由于提供相类类类类似的效力,从而具有一似的效力,从而具有一似的效力,从而具有一似的效力,从而具有一样样样样的接口。比如的接口。比如的接口。比如的接口。比如说说说说,两个,两个,两个,两个实现实现实现实现RunnableRunnable接口的接口的接口的接口的类类类类除了都有一个除了都有一个除了都有一个除了都有一个pub
6、lic void run()public void run()方法之外,能方法之外,能方法之外,能方法之外,能够够够够没有其没有其没有其没有其他任何的共同点。他任何的共同点。他任何的共同点。他任何的共同点。接口和接口和类主要区主要区别接口接口接口接口仅仅仅仅描画方法的特征,而不描画方法的特征,而不描画方法的特征,而不描画方法的特征,而不给给出方法的出方法的出方法的出方法的实现实现;类类不不不不仅给仅给出方法的特征,而且出方法的特征,而且出方法的特征,而且出方法的特征,而且给给出方法的出方法的出方法的出方法的实现实现。 接口把方法的特征和方法的接口把方法的特征和方法的接口把方法的特征和方法的接口
7、把方法的特征和方法的实现实现分割开来。分割开来。分割开来。分割开来。这这种分种分种分种分割,表达在接口割,表达在接口割,表达在接口割,表达在接口经经常代表一个角色,它包装与常代表一个角色,它包装与常代表一个角色,它包装与常代表一个角色,它包装与该该角色相角色相角色相角色相关的操作和属性,而关的操作和属性,而关的操作和属性,而关的操作和属性,而实现这实现这个接口的个接口的个接口的个接口的类类便是扮演便是扮演便是扮演便是扮演这这个角个角个角个角色的演色的演色的演色的演员员。一个角色可以由不同的演。一个角色可以由不同的演。一个角色可以由不同的演。一个角色可以由不同的演员员来演,而不同的来演,而不同的
8、来演,而不同的来演,而不同的演演演演员员之之之之间间除了扮演同一个角色之外,并不要求有其它的除了扮演同一个角色之外,并不要求有其它的除了扮演同一个角色之外,并不要求有其它的除了扮演同一个角色之外,并不要求有其它的任何共同之任何共同之任何共同之任何共同之处处。为什么运用接口什么运用接口1. 1. 接口是接口是接口是接口是对对可插人性的保可插人性的保可插人性的保可插人性的保证证 在一个在一个在一个在一个类类等等等等级级构造中的任何一构造中的任何一构造中的任何一构造中的任何一类类都可以都可以都可以都可以实现实现一个接口,一个接口,一个接口,一个接口,这这个接口会影响到此个接口会影响到此个接口会影响到
9、此个接口会影响到此类类的一切子的一切子的一切子的一切子类类,但是不会影响到此,但是不会影响到此,但是不会影响到此,但是不会影响到此类类的的的的任何超任何超任何超任何超类类。此。此。此。此类类将不得不将不得不将不得不将不得不实现这实现这个接口所个接口所个接口所个接口所规规定的方法,而其定的方法,而其定的方法,而其定的方法,而其子子子子类类那么可以从此那么可以从此那么可以从此那么可以从此类类自自自自动动承承承承继继到到到到这这些方法,当然也可以些方法,当然也可以些方法,当然也可以些方法,当然也可以选择选择置置置置换换掉一切的掉一切的掉一切的掉一切的这这些方法,或者其中的某一些方法。些方法,或者其中
10、的某一些方法。些方法,或者其中的某一些方法。些方法,或者其中的某一些方法。 这时这时候,候,候,候,这这些子些子些子些子类类就具有了可插入性。就具有了可插入性。就具有了可插入性。就具有了可插入性。关关联的可插入性的可插入性 一个对象需求完成一项义务,所以需求知道其他的对象,一个对象需求完成一项义务,所以需求知道其他的对象,并且调用其他对象的方法。这个对象对其他对象的知识叫做并且调用其他对象的方法。这个对象对其他对象的知识叫做关联关联(Association)。 假设一个关联不是针对一个详细类的,而是针对一个接假设一个关联不是针对一个详细类的,而是针对一个接口的,那么任何实现这个接口的类就都可以
11、满足要求。换言口的,那么任何实现这个接口的类就都可以满足要求。换言之,当前对象并不在意所关联的是哪一个详细类,而仅仅关之,当前对象并不在意所关联的是哪一个详细类,而仅仅关怀这个类能否实现了某一个接口。怀这个类能否实现了某一个接口。 这样一来,就可以动态地将这个关联从一个详细类转换这样一来,就可以动态地将这个关联从一个详细类转换到另一个详细类,而这样做的独一条件是它们都实现某个接到另一个详细类,而这样做的独一条件是它们都实现某个接口。口。例如:例如:例如:例如: 不要运用下面的声明不要运用下面的声明不要运用下面的声明不要运用下面的声明语语句:句:句:句: Vector employees = n
12、ew Vector(); / Vector Vector employees = new Vector(); / Vector是是是是JavaJava的一个的一个的一个的一个类类 而而而而应该应该运用下面的声明运用下面的声明运用下面的声明运用下面的声明语语句:句:句:句: List employees = new Vector(); /List List employees = new Vector(); /List 是是是是JavaJava的一的一的一的一个接口个接口个接口个接口 这样这样作的益作的益作的益作的益处处是,在决是,在决是,在决是,在决议议将将将将VectorVector类类型型
13、型型转换转换成成成成ArrayListArrayList时时,需求改,需求改,需求改,需求改动动得很少:得很少:得很少:得很少: List employees = new ArrayList(); List employees = new ArrayList();调用的可插入性用的可插入性 同同同同样样,一个,一个,一个,一个对对象不可防止地需求象不可防止地需求象不可防止地需求象不可防止地需求调调用其他用其他用其他用其他对对象的方象的方象的方象的方法。法。法。法。这这种种种种调调用不一定非得是某一个用不一定非得是某一个用不一定非得是某一个用不一定非得是某一个详细类详细类,而可以是一,而可以是一
14、,而可以是一,而可以是一个接口。个接口。个接口。个接口。这样这样一来,任何一来,任何一来,任何一来,任何实现实现了了了了这这个接口的个接口的个接口的个接口的详细类详细类都可都可都可都可以被当前以被当前以被当前以被当前对对象象象象调调用;而当前用;而当前用;而当前用;而当前对对象究竟象究竟象究竟象究竟调调用的是哪一个用的是哪一个用的是哪一个用的是哪一个详详细类细类的的的的实实例那么完全可以例那么完全可以例那么完全可以例那么完全可以动态动态地决地决地决地决议议。 因此,接口提供了关因此,接口提供了关因此,接口提供了关因此,接口提供了关联联以及方法以及方法以及方法以及方法调调用上的可插入性,用上的可
15、插入性,用上的可插入性,用上的可插入性,软软件系件系件系件系统统的的的的规规模越大,生命周期越模越大,生命周期越模越大,生命周期越模越大,生命周期越长长,接口的重要性就,接口的重要性就,接口的重要性就,接口的重要性就越大。接口使得越大。接口使得越大。接口使得越大。接口使得软软件系件系件系件系统统在灵敏性和可在灵敏性和可在灵敏性和可在灵敏性和可扩扩展性、可插入展性、可插入展性、可插入展性、可插入性方面得到保性方面得到保性方面得到保性方面得到保证证。例如:例如:例如:例如:public class examplepublic class example List myList; List myLi
16、st; public example(List aList ) public example(List aList ) myList=aList; myList=aList; public int getSize() public int getSize() return myList.size() return myList.size() public static void main(String args) public static void main(String args) ArrayList employees = new ArrayList(); ArrayList emplo
17、yees = new ArrayList(); example ep=new example(employees); example ep=new example(employees); System.out.println(ep. getSize(); System.out.println(ep. getSize(); 2. Java2. Java接口接口接口接口( (以及以及以及以及JavaJava笼统类笼统类笼统类笼统类) )用来声明一个新的用来声明一个新的用来声明一个新的用来声明一个新的类类类类型型型型 Java Java设计师该设计师该设计师该设计师该当主要运用当主要运用当主要运用当
18、主要运用JavaJava接口和接口和接口和接口和笼统类笼统类笼统类笼统类将将将将软软软软件件件件单单单单位位位位与内部和外部耦合起来。与内部和外部耦合起来。与内部和外部耦合起来。与内部和外部耦合起来。 换换换换言之,言之,言之,言之,该该该该当运用当运用当运用当运用JavaJava接口和接口和接口和接口和笼统类笼统类笼统类笼统类而不是而不是而不是而不是详细类进详细类进详细类进详细类进展展展展变变变变量的量的量的量的类类类类型声明、参量的型声明、参量的型声明、参量的型声明、参量的类类类类型声明、方法的前往型声明、方法的前往型声明、方法的前往型声明、方法的前往类类类类型声明,型声明,型声明,型声明
19、,以及数据以及数据以及数据以及数据类类类类型的型的型的型的转换转换转换转换等。当然,一个更好的做法是等。当然,一个更好的做法是等。当然,一个更好的做法是等。当然,一个更好的做法是仅仅仅仅仅仅仅仅运用运用运用运用JavaJava接口,而不要运用接口,而不要运用接口,而不要运用接口,而不要运用笼统笼统笼统笼统JavaJava类类类类来做到上面来做到上面来做到上面来做到上面这这这这些。些。些。些。 在理想的情况下,一个在理想的情况下,一个在理想的情况下,一个在理想的情况下,一个详细详细详细详细JavaJava类该类该类该类该当只当只当只当只实现实现实现实现JavaJava接口接口接口接口和和和和笼统
20、类笼统类笼统类笼统类中声明中声明中声明中声明过过过过的方法,而不的方法,而不的方法,而不的方法,而不该该该该当当当当给给给给出多余的方法。出多余的方法。出多余的方法。出多余的方法。3. Java3. Java接口接口接口接口( (以及以及以及以及JavaJava笼统类笼统类笼统类笼统类) )普通用来作普通用来作普通用来作普通用来作为为为为一个一个一个一个类类类类型的等型的等型的等型的等级级级级构造的起点构造的起点构造的起点构造的起点 Java Java的的的的类类类类型是以型是以型是以型是以类类类类型等型等型等型等级级级级构造构造构造构造(Type Hierarchy)(Type Hierar
21、chy)的方式的方式的方式的方式组组组组织织织织起来在一个起来在一个起来在一个起来在一个类类类类型等型等型等型等级级级级构造里面,一个构造里面,一个构造里面,一个构造里面,一个类类类类型可以有一系列的超型可以有一系列的超型可以有一系列的超型可以有一系列的超类类类类型型型型(Supertype)(Supertype),这时这这时这这时这这时这个个个个类类类类型叫做其超型叫做其超型叫做其超型叫做其超类类类类型的子型的子型的子型的子类类类类型。型。型。型。 假假假假设设设设一个一个一个一个类类类类曾曾曾曾经经经经有一个主要的超有一个主要的超有一个主要的超有一个主要的超类类类类型,那么型,那么型,那么
22、型,那么经过实现经过实现经过实现经过实现一个一个一个一个接口,接口,接口,接口,这这这这个个个个类类类类可以可以可以可以拥拥拥拥有另一个次要的超有另一个次要的超有另一个次要的超有另一个次要的超类类类类型。型。型。型。这这这这种次要的超种次要的超种次要的超种次要的超类类类类型就叫做混合型就叫做混合型就叫做混合型就叫做混合类类类类型型型型(Mixing Type)(Mixing Type)。 如前面所如前面所如前面所如前面所谈谈谈谈到的,当一个到的,当一个到的,当一个到的,当一个详细类处详细类处详细类处详细类处于一个于一个于一个于一个类类类类的等的等的等的等级级级级构造之构造之构造之构造之中的中的
23、中的中的时时时时候,候,候,候,为这为这为这为这个个个个详细类详细类详细类详细类定定定定义义义义一个混合一个混合一个混合一个混合类类类类型是可以保型是可以保型是可以保型是可以保证证证证基于基于基于基于这这这这个个个个类类类类型的可插入性的关型的可插入性的关型的可插入性的关型的可插入性的关键键键键。因此,混合。因此,混合。因此,混合。因此,混合类类类类型是一个非常重要的型是一个非常重要的型是一个非常重要的型是一个非常重要的概念。概念。概念。概念。 显显显显然,然,然,然,JavaJava接口是接口是接口是接口是实现实现实现实现混合混合混合混合类类类类型的最理想的工具。型的最理想的工具。型的最理想
24、的工具。型的最理想的工具。 什么是什么是笼统类 笼统类仅笼统类仅提供一个提供一个提供一个提供一个类类型的部分型的部分型的部分型的部分实现实现。笼统类笼统类可以有可以有可以有可以有实实例例例例变变量,以及一个或多个构造方法。量,以及一个或多个构造方法。量,以及一个或多个构造方法。量,以及一个或多个构造方法。笼统类笼统类可以同可以同可以同可以同时时有有有有笼统笼统方方方方法和法和法和法和详细详细方法。方法。方法。方法。 一个一个一个一个笼统类笼统类不会有不会有不会有不会有实实例,例,例,例,这这些构造方法不能被客些构造方法不能被客些构造方法不能被客些构造方法不能被客户户端端端端调调用来用来用来用来
25、创创建建建建实实例。一个例。一个例。一个例。一个笼统类笼统类的构造方法可以被其子的构造方法可以被其子的构造方法可以被其子的构造方法可以被其子类调类调用,用,用,用,从而使一个从而使一个从而使一个从而使一个笼统类笼统类的一切子的一切子的一切子的一切子类类都可以有一些共有的都可以有一些共有的都可以有一些共有的都可以有一些共有的实现实现,而,而,而,而不同的子不同的子不同的子不同的子类类可以在此根底上有其本人的可以在此根底上有其本人的可以在此根底上有其本人的可以在此根底上有其本人的实现实现。 笼统类笼统类和子和子和子和子类类的的的的这这种关系种关系种关系种关系实实践上是模版方法方式的运用。践上是模版
26、方法方式的运用。践上是模版方法方式的运用。践上是模版方法方式的运用。笼统类的用途的用途 Java Java笼统类笼统类笼统类笼统类与与与与JavaJava接口一接口一接口一接口一样样样样,都用来声明一个新的,都用来声明一个新的,都用来声明一个新的,都用来声明一个新的类类类类型,型,型,型,并且作并且作并且作并且作为为为为一个一个一个一个类类类类型的等型的等型的等型的等级级级级构造的起点。但是,构造的起点。但是,构造的起点。但是,构造的起点。但是,JavaJava接口具有接口具有接口具有接口具有比比比比JavaJava笼统类笼统类笼统类笼统类更好的特性,因此,更好的特性,因此,更好的特性,因此,
27、更好的特性,因此,该该该该当当当当优优优优先运用先运用先运用先运用JavaJava接口声接口声接口声接口声明一个超明一个超明一个超明一个超类类类类型。型。型。型。 笼统类笼统类笼统类笼统类通常代表一个通常代表一个通常代表一个通常代表一个笼统笼统笼统笼统概念,它提供一个承概念,它提供一个承概念,它提供一个承概念,它提供一个承继继继继的出的出的出的出发发发发点。而点。而点。而点。而详细类详细类详细类详细类那么不同,那么不同,那么不同,那么不同,详细类详细类详细类详细类可以可以可以可以实实实实例化,例化,例化,例化,该该该该当当当当给给给给出一个出一个出一个出一个有商有商有商有商业逻辑实现业逻辑实现
28、业逻辑实现业逻辑实现的的的的对对对对象模版。由于象模版。由于象模版。由于象模版。由于笼统类笼统类笼统类笼统类不可以不可以不可以不可以实实实实例化,因例化,因例化,因例化,因此一个此一个此一个此一个设计师设计设计师设计设计师设计设计师设计一个新的一个新的一个新的一个新的笼统类笼统类笼统类笼统类,一定是用来承,一定是用来承,一定是用来承,一定是用来承继继继继的。的。的。的。 而而而而这这这这一个声明倒一个声明倒一个声明倒一个声明倒过过过过来也是来也是来也是来也是对对对对的:的:的:的:详细类详细类详细类详细类不是用来承不是用来承不是用来承不是用来承继继继继的。的。的。的。笼统类该当当拥有尽能有尽能
29、够多的共同代多的共同代码 在一个从在一个从在一个从在一个从笼统类笼统类到多个到多个到多个到多个详细类详细类的承的承的承的承继继关系中,共同的代关系中,共同的代关系中,共同的代关系中,共同的代码该码该当尽量挪当尽量挪当尽量挪当尽量挪动动到到到到笼统类笼统类里。在一个承里。在一个承里。在一个承里。在一个承继继的等的等的等的等级级构造中,共构造中,共构造中,共构造中,共同的代同的代同的代同的代码该码该当尽量向等当尽量向等当尽量向等当尽量向等级级构造的上方挪构造的上方挪构造的上方挪构造的上方挪动动。 把反复的代把反复的代把反复的代把反复的代码码从子从子从子从子类类里面挪里面挪里面挪里面挪动动到超到超到
30、超到超类类里面,可以提高代里面,可以提高代里面,可以提高代里面,可以提高代码码的复用率。由于代的复用率。由于代的复用率。由于代的复用率。由于代码码在共同的超在共同的超在共同的超在共同的超类类而不是几个子而不是几个子而不是几个子而不是几个子类类中出中出中出中出现现,在代在代在代在代码发码发生改生改生改生改动时动时,设计师设计师只需求修正一个地方。只需求修正一个地方。只需求修正一个地方。只需求修正一个地方。这对这对代代代代码码的复用明的复用明的复用明的复用明显显是有利的。是有利的。是有利的。是有利的。 一个一个一个一个对对象从超象从超象从超象从超类类承承承承继继而来的代而来的代而来的代而来的代码码
31、,在不运用,在不运用,在不运用,在不运用时时不会呵斥不会呵斥不会呵斥不会呵斥对资对资源的浪源的浪源的浪源的浪费费。笼统类笼统类笼统类笼统类详细类详细类笼统类笼统类详细类详细类详细类详细类代代代代码码集集集集中中中中的的的的方方方方向向向向代代码重构的建重构的建议A AB BC CA AB B重构重构重构重构为为 设计师该设计师该当将当将当将当将类类A A和和和和类类B B的共同代的共同代的共同代的共同代码码尽量挪尽量挪尽量挪尽量挪动动到到到到笼统笼统超超超超类类C C里面,里面,里面,里面,这样这样可以保可以保可以保可以保证证最大限制的复用。最大限制的复用。最大限制的复用。最大限制的复用。笼统
32、类该当当拥有尽能有尽能够少的数据少的数据 与代与代与代与代码码的挪的挪的挪的挪动动方向相反的是,数据的挪方向相反的是,数据的挪方向相反的是,数据的挪方向相反的是,数据的挪动动方向是从方向是从方向是从方向是从笼笼统类统类到到到到详细类详细类,也即从承,也即从承,也即从承,也即从承继继的等的等的等的等级级构造的高端向等构造的高端向等构造的高端向等构造的高端向等级级构造构造构造构造的低端挪的低端挪的低端挪的低端挪动动。 一个一个一个一个对对象的数据不象的数据不象的数据不象的数据不论论能否运用都会占用能否运用都会占用能否运用都会占用能否运用都会占用资资源,因此数源,因此数源,因此数源,因此数据据据据该
33、该当尽量放到当尽量放到当尽量放到当尽量放到详细类详细类或者等或者等或者等或者等级级构造的低端。构造的低端。构造的低端。构造的低端。笼统类笼统类笼统类笼统类详细类详细类笼统类笼统类详细类详细类详细类详细类数数数数据据据据集集集集中中中中的的的的方方方方向向向向笼统类的运用的运用1 1、针对笼统编针对笼统编程,不要程,不要程,不要程,不要针对详细编针对详细编程程程程 这这就是依就是依就是依就是依赖赖倒倒倒倒转转原那么原那么原那么原那么(Inverse Dependency)(Inverse Dependency)。换换言之,言之,言之,言之,该该当当当当针对笼统类编针对笼统类编程,不要程,不要程,
34、不要程,不要针对详细针对详细子子子子类类编编程,程,程,程,这这一原那么点出了一原那么点出了一原那么点出了一原那么点出了笼统类对笼统类对代代代代码码复用的一个复用的一个复用的一个复用的一个最重要的作用。最重要的作用。最重要的作用。最重要的作用。2 2、正确运用承、正确运用承、正确运用承、正确运用承继继 在在在在JavaJava言言言言语语中,承中,承中,承中,承继继关系可以分成两种:一种关系可以分成两种:一种关系可以分成两种:一种关系可以分成两种:一种是是是是类对类对接口的接口的接口的接口的实现实现,称做接口承,称做接口承,称做接口承,称做接口承继继;另一种是;另一种是;另一种是;另一种是类对
35、类对类类的承的承的承的承继继,称做,称做,称做,称做实现实现承承承承继继。第二种承。第二种承。第二种承。第二种承继继关系是很容关系是很容关系是很容关系是很容易被易被易被易被滥滥用的一种复用工具。正如前面所指出的,用的一种复用工具。正如前面所指出的,用的一种复用工具。正如前面所指出的,用的一种复用工具。正如前面所指出的,笼笼统类统类是用来承是用来承是用来承是用来承继继的,因此的,因此的,因此的,因此笼统类笼统类注定要与承注定要与承注定要与承注定要与承继继关关关关联联在一同,只需能在一同,只需能在一同,只需能在一同,只需能够够,尽量运用合成,尽量运用合成,尽量运用合成,尽量运用合成(Composi
36、tion)(Composition),而不要运用承,而不要运用承,而不要运用承,而不要运用承继继来到达复用的目的。来到达复用的目的。来到达复用的目的。来到达复用的目的。什么什么时候才候才该当运用承当运用承继复用复用 承承承承继继代表代表代表代表“ “普通化普通化普通化普通化/ /特殊化关系,其中基特殊化关系,其中基特殊化关系,其中基特殊化关系,其中基类类代表普通,代表普通,代表普通,代表普通,而衍生而衍生而衍生而衍生类类代表特殊,衍生代表特殊,衍生代表特殊,衍生代表特殊,衍生类类将基将基将基将基类类特殊化或特殊化或特殊化或特殊化或扩扩展化。只需当展化。只需当展化。只需当展化。只需当以下的条件全
37、部被以下的条件全部被以下的条件全部被以下的条件全部被满满足足足足时时,才,才,才,才该该当运用承当运用承当运用承当运用承继继关系:关系:关系:关系:(1)(1)子子子子类类是超是超是超是超类类的一个特殊种的一个特殊种的一个特殊种的一个特殊种类类,而不是超,而不是超,而不是超,而不是超类类的一个角色,也的一个角色,也的一个角色,也的一个角色,也就是要区分就是要区分就是要区分就是要区分“Has-A“Has-A与与与与“Is-A“Is-A两种关系的不同。两种关系的不同。两种关系的不同。两种关系的不同。Has-AHas-A关关关关系系系系该该当运用聚合关系描画,而只需当运用聚合关系描画,而只需当运用聚
38、合关系描画,而只需当运用聚合关系描画,而只需Is-AIs-A关系才符合承关系才符合承关系才符合承关系才符合承继继关系。关系。关系。关系。 (2)(2)子子子子类类具有具有具有具有扩扩展超展超展超展超类类的的的的责责任,而不是具有置任,而不是具有置任,而不是具有置任,而不是具有置换换掉掉掉掉(Override)(Override)或注或注或注或注销销掉掉掉掉(Nullify)(Nullify)超超超超类类的的的的责责任。假任。假任。假任。假设设子子子子类类需求大需求大需求大需求大量地置量地置量地置量地置换换掉超掉超掉超掉超类类的行的行的行的行为为,那么,那么,那么,那么这这个子个子个子个子类类不
39、不不不该该当成当成当成当成为这为这个超个超个超个超类类的于的于的于的于类类。(3)(3)只需在分只需在分只需在分只需在分类类学角度上有意学角度上有意学角度上有意学角度上有意义时义时,才可以运用承,才可以运用承,才可以运用承,才可以运用承继继,不要,不要,不要,不要从工具从工具从工具从工具类类承承承承继继。一个工具。一个工具。一个工具。一个工具类类必定有本人的行必定有本人的行必定有本人的行必定有本人的行为为特性,一个特性,一个特性,一个特性,一个商商商商业类业类型封装了商型封装了商型封装了商型封装了商业逻辑业逻辑,不能,不能,不能,不能够够是工具是工具是工具是工具类类型一种。型一种。型一种。型一种。换换言言言言之,几乎没有例外,从工具之,几乎没有例外,从工具之,几乎没有例外,从工具之,几乎没有例外,从工具类类型承型承型承型承继继是是是是错误错误的。的。的。的。