面向对象九个重要概念
1、封装(encapsulation)
对象(或者说是类)可以封装变量, 函数及其它对象. 所谓"封装"即调用对象的用户不必了解实现特定功能的详细代码和过程, 只需懂得设置对象属性(即定义时被封装的变量), 调用其方法(即定义时被封装的函数)就可以了.
2、信息/实现的隐藏
一个被封装的单元可以从外部(公有视图),也可以从内部(私有视图)来访问。良好封装的代价是公有视图中无数细节的压缩,这些细节只可以被私有视图访问。这样的压缩有两种形式:信息隐藏和实现隐藏。信息隐藏意味着程序单元中的信息不能从单元外部来访问。实现隐藏意味着实现的细节不能从单元外部来获取。
信息/实现隐藏就是封装的使用,它使得从外部访问内部封装的特定信息或实现时受到一定的限制。
信息/实现隐藏有两个主要优点:
(1)它定位了设计决策。私有设计(对象内部的)对系统的其余部分几乎没有影响或者影响很小。因此,这种决策使得设计和修改对系统的影响减至最小,这可以称为“涟波效应”。
(2)它减弱了信息的表现形式对其内容的影响。因此,对象的外部使用者的信息不依赖于任何内部的信息格式。这使得外部使用者不能对信息内容进行变动。它也防止了引入一些不稳定的到对象中的连接。
3、状态保留
面向对象的第3个概要就是对象保留状态的能力。当传统的过程性模块(函数、子程序、过程等)返回到它的调用者时,这个模块便不存在了,仅仅保留结果。当相同的模块再次被调用时,它同首次调用时没有任何差别。该模块对于之前的调用没有任何记录,实际上,同人一样,对上辈子的事没有任何概念。
但是对象,比如虚拟人,却可以记录过去。它保留了不定时间范围内的信息。举例来说,对象的调用者可以为它提供一些信息,这个调用者或者其他调用者可以在随后要求对象再次提供这些信息。换句话说,当对象停止执行时,它在待机状态,随时准备下次的运行。
4、对象标识
对象标识就是每个对象(不论是它的类还是当前状态)都可以被当做一个独特的软件实体来进行识别和处理的属性。
5、消息
消息就是发送对象ob1传递给目标对象ob2一个指令,让ob2应用它的一个方法的途径。
一个消息包括几个语法部分,每个部分在面向对象设计中都有其重要意义。实际上,本书会多次提及消息的各个组成部分。
为了让对象ob1给对象ob2传递一个可用的消息,对象ob1必须知道以下三点:
ob2的句柄。(很明显,当你传递消息时,你必须知道你要传给谁。)通常,ob1将在它的一个变量中存储ob2的句柄信息。
ob1希望ob2执行的方法的名称。
ob2执行这个方法时所需的任何信息或参数。
传递消息的对象(ob1)被称为发送者,接收消息的对象(ob2)被称为目标。
6、类
类就是创建或者实例化对象的模板。每个对象都与其对应的类有相同的结构和行为。如果对象ob属于类C,我们就说“ob是C的实例”。
7、继承
继承(D继承C)是类D的对象可以使用仅对类C的对象有效的方法或变量的特性,它使得这些方法和变量就好像是由类D定义的。C是D的父类,D是C的子类。
8、多态
多态是可以被多个类定义的方法并在每个类中都有不同实现的特性。
多态是同一个变量不同时间指向不同类的对象(或拥有不同类对象句柄)的特性。
重载是一个名字或者记号,就是说同一个类的几个方法有相同的名字或者标识。我们就说这个名字或者标识是重载的。
9、泛型
泛型是类C的结构,在运行期(类的对象实例化的时候)它可以应用于一个或多个类。
总结:
面向对象封装产生了一种软件结构(或者“对象”),它包括一系列过程性的方法,这些方法涉及的变量保留着对象的状态,封装使得所有来自对象外的对变量的访问必须通过调用对象的方法来实现。
信息/实现隐藏是好的封装的结果。好的封装使得信息只面对它的对象,并且使外部程序不会对对象的内部实现构成干扰。
状态保留是对象可以确切地保存信息的属性,包括在方法激活间隙的状态保留。
对象标识使每个对象都有独立于状态的独特标识。句柄机制是常用的对象标识分配方法。
传送消息的对象必须知道目标对象的句柄。消息中包含了目标对象的句柄,以及传递的参数。参数可能是数据或者指向数据的指针。在纯面向对象中,参数指的是指针。
同一个类衍生的对象有相同的结构和行为。类就是设计和编码的模板,从这个模板中类的实例——对象在运行期间被创建。类有一组类方法和类变量。每个对象有它自己的一组实例方法和实例变量。同一个类的对象通过共享实例方法节省了存储空间。
类可以形成父类/子类继承层结构,或者更确切地说是继承网格。继承使得类的对象可以使用父类的任何属性。你也可以在子类里重新定义方法(重写)。
多态是同一个方法可以被多个类定义并在每个类中都有不同实现的特性,或者也可以说,多态变量可以在不同时间指向属于不同类的对象的特性。
多态增加了实现隐藏的复杂性,使得面向对象更加强大。比如,一个传送对象可以在不知道目标对象的确切类的情况下传送消息。只要这个方法是可以被所有可能的类所访问的。方法的选择可以留在运行期。
重载是同多态类似的概念,它可以通过检查消息参数的号码或者类来选择不同方法的实现。多态和重载都要求动态(或者是运行期)绑定。
实例化对象时,泛型允许一个类作为类的参数。它允许简单地创建一个容器类,就好像一个骨架,类可以在运行期加进去。泛型具有无复制的开销进行代码克隆的优点。
对象(或者说是类)可以封装变量, 函数及其它对象. 所谓"封装"即调用对象的用户不必了解实现特定功能的详细代码和过程, 只需懂得设置对象属性(即定义时被封装的变量), 调用其方法(即定义时被封装的函数)就可以了.
2、信息/实现的隐藏
一个被封装的单元可以从外部(公有视图),也可以从内部(私有视图)来访问。良好封装的代价是公有视图中无数细节的压缩,这些细节只可以被私有视图访问。这样的压缩有两种形式:信息隐藏和实现隐藏。信息隐藏意味着程序单元中的信息不能从单元外部来访问。实现隐藏意味着实现的细节不能从单元外部来获取。
信息/实现隐藏就是封装的使用,它使得从外部访问内部封装的特定信息或实现时受到一定的限制。
信息/实现隐藏有两个主要优点:
(1)它定位了设计决策。私有设计(对象内部的)对系统的其余部分几乎没有影响或者影响很小。因此,这种决策使得设计和修改对系统的影响减至最小,这可以称为“涟波效应”。
(2)它减弱了信息的表现形式对其内容的影响。因此,对象的外部使用者的信息不依赖于任何内部的信息格式。这使得外部使用者不能对信息内容进行变动。它也防止了引入一些不稳定的到对象中的连接。
3、状态保留
面向对象的第3个概要就是对象保留状态的能力。当传统的过程性模块(函数、子程序、过程等)返回到它的调用者时,这个模块便不存在了,仅仅保留结果。当相同的模块再次被调用时,它同首次调用时没有任何差别。该模块对于之前的调用没有任何记录,实际上,同人一样,对上辈子的事没有任何概念。
但是对象,比如虚拟人,却可以记录过去。它保留了不定时间范围内的信息。举例来说,对象的调用者可以为它提供一些信息,这个调用者或者其他调用者可以在随后要求对象再次提供这些信息。换句话说,当对象停止执行时,它在待机状态,随时准备下次的运行。
4、对象标识
对象标识就是每个对象(不论是它的类还是当前状态)都可以被当做一个独特的软件实体来进行识别和处理的属性。
5、消息
消息就是发送对象ob1传递给目标对象ob2一个指令,让ob2应用它的一个方法的途径。
一个消息包括几个语法部分,每个部分在面向对象设计中都有其重要意义。实际上,本书会多次提及消息的各个组成部分。
为了让对象ob1给对象ob2传递一个可用的消息,对象ob1必须知道以下三点:
ob2的句柄。(很明显,当你传递消息时,你必须知道你要传给谁。)通常,ob1将在它的一个变量中存储ob2的句柄信息。
ob1希望ob2执行的方法的名称。
ob2执行这个方法时所需的任何信息或参数。
传递消息的对象(ob1)被称为发送者,接收消息的对象(ob2)被称为目标。
6、类
类就是创建或者实例化对象的模板。每个对象都与其对应的类有相同的结构和行为。如果对象ob属于类C,我们就说“ob是C的实例”。
7、继承
继承(D继承C)是类D的对象可以使用仅对类C的对象有效的方法或变量的特性,它使得这些方法和变量就好像是由类D定义的。C是D的父类,D是C的子类。
8、多态
多态是可以被多个类定义的方法并在每个类中都有不同实现的特性。
多态是同一个变量不同时间指向不同类的对象(或拥有不同类对象句柄)的特性。
重载是一个名字或者记号,就是说同一个类的几个方法有相同的名字或者标识。我们就说这个名字或者标识是重载的。
9、泛型
泛型是类C的结构,在运行期(类的对象实例化的时候)它可以应用于一个或多个类。
总结:
面向对象封装产生了一种软件结构(或者“对象”),它包括一系列过程性的方法,这些方法涉及的变量保留着对象的状态,封装使得所有来自对象外的对变量的访问必须通过调用对象的方法来实现。
信息/实现隐藏是好的封装的结果。好的封装使得信息只面对它的对象,并且使外部程序不会对对象的内部实现构成干扰。
状态保留是对象可以确切地保存信息的属性,包括在方法激活间隙的状态保留。
对象标识使每个对象都有独立于状态的独特标识。句柄机制是常用的对象标识分配方法。
传送消息的对象必须知道目标对象的句柄。消息中包含了目标对象的句柄,以及传递的参数。参数可能是数据或者指向数据的指针。在纯面向对象中,参数指的是指针。
同一个类衍生的对象有相同的结构和行为。类就是设计和编码的模板,从这个模板中类的实例——对象在运行期间被创建。类有一组类方法和类变量。每个对象有它自己的一组实例方法和实例变量。同一个类的对象通过共享实例方法节省了存储空间。
类可以形成父类/子类继承层结构,或者更确切地说是继承网格。继承使得类的对象可以使用父类的任何属性。你也可以在子类里重新定义方法(重写)。
多态是同一个方法可以被多个类定义并在每个类中都有不同实现的特性,或者也可以说,多态变量可以在不同时间指向属于不同类的对象的特性。
多态增加了实现隐藏的复杂性,使得面向对象更加强大。比如,一个传送对象可以在不知道目标对象的确切类的情况下传送消息。只要这个方法是可以被所有可能的类所访问的。方法的选择可以留在运行期。
重载是同多态类似的概念,它可以通过检查消息参数的号码或者类来选择不同方法的实现。多态和重载都要求动态(或者是运行期)绑定。
实例化对象时,泛型允许一个类作为类的参数。它允许简单地创建一个容器类,就好像一个骨架,类可以在运行期加进去。泛型具有无复制的开销进行代码克隆的优点。