下面一个概念呢是,或者说一个面向对象方法学中的一个
重要的一个原则呢是实例化的原则。
实例化的原则呢, 什么是实例化呢?实际上是也是我们这个自然
这个世界或者说我们日常生活中 经常会碰到的一个问题。
比如说这个我们 很多的一些事物,包括人呀,各种动物啊,植物啊 一些桌椅板凳,
是怎么来的?它们实际上呢是实例化 的一个过程。
也就是说这个我们这个凡是我们的这个
这种人的生产,或者说这个这种实例化呢
还是相对来复杂的,它本身呢是由一个实例实例为另外一个 实例的一个过程。
而我们这个面向对象中的这个实例化呢一般是指是以类为模板,产生
实例的这个过程,更确切的一个与日常世界中的一个
这个类比呢就是比如说我们这个一些模具,然后呢我们做月饼的一些模具,
这是一个,相当于一个模板,然后呢我们以这个为模板,然后
这个产生一些月饼的实例,这是
与我们面向对象中的这个实例化是非常相似的。
但是呢也并不代表 就是我们这种人的实例化,或者说是动物的实例化,植物的实例化,这些生物
的一些实例化的过程,是由一个实例产生另外一个实例的过程,而这些
实例化的过程呢也用面向对象这套语言机制也不是不能模拟,
比如说设计模式中的一些克隆,这些模式,它实际上呢
就是以一个对象为模板,通过复制这个对象的结构,产生另外一个对象的一个过程。
这也是用面向对象的一些语言,提供了一些语言的一些便利条件,也是可以
模拟这种方式。
那么实例化 对于我们这个面向对象的开发或者说编程而言,
有什么意义呢?首先呢实例化的这个过程呢,
实际上是比较符合我们自然的这种思维方式。
我们在我们这个这种 自然这种思维方式下,任何事物呢都是,都是一个
特定类的一个实例,然后我们只有把它实例化之后我们才能
才能够向它
发送消息,或者说呢向它这个提供服务,或者说呢向它 要求服务。
如果说一个很抽象的这么一个类的话,我们无法直接向它
发送我们的请求,所以呢这个实例化的这种方式呢比较符合我们
的一种自然思维方式。
更重要的是呢这个实例化 这种方式可以使得并发处理成为可能,
比如说我们举一个简单的例子,这里有一个大家都知道的一个数据结构中的这个栈,栈呢
实际上它有那个几个操作,一方面它是有一个 类似于一个数组,或者是链表的一个数据结构组成。
另一方面,它还有操作这个数据结构的一些
函数来组成,比如说实例化一个栈,push 一个栈,向栈压一个数据,
然后呢或者说向栈 pop 出一个数据,这个栈呢可以认为是一个类,
这个一个,一个对象的一个封装。
为什么 实例化呢?就是说假设说我们现在呢有两个需要
同时压栈或出栈的这个工作,可以说是我们这个用
自然思维方式呢我们可以说是两个人,同时要访问这个
栈,或者说我们用软件的这个术语来说呢,两个线程
要同时访问我这个栈,如果说我这个栈就一个实例的话,
像在没有实例化阶段的时候,我们只有一个实例化,那么我们这两个线程, 同时
push,同时 pop,那就会导致整个这个数据呢发生混乱。
就不是对于每一个具体的一个使用者而言呢, 他
pop 和 push 呢,他都是要求把他的 pop
的时候是要把他以前 push 的数据来 这个
pop 出来,但是如果说两个以上的这个
这个线程同时访问一个 栈的话,这就会导致有可能另外一个人
pop 出来的 push 的一个数据被其他的人呢所 push 出来,这样呢就会
导致逻辑混乱,但是如果实例化的话这就可以很好的避免这种情况。
就我们根据一个模板,一个栈的模板,然后呢实例化一个
栈的实例给这个线程,另外一个线程呢实例化另外一个
线程的,栈的实例,这样的话呢,它们之间呢就可以
互不影响,所有的逻辑呢都可以这个达到,最终呢达到
正确的一个使用的逻辑,这就是实例化的意义,也就是实例化呢是并发处理 成为可能。
实际上在面向,面向过程到面向对象这种方法学转换的过程中,
最初呢是只有封装的概念,而没有实例化的概念,后来呢人们
为了更好的让这些模块处理并发,所以呢又添加
了实例化的这么一种机制。
因此呢 我们可以说,从面向过程到面向对象的这个转化的过程中,实际上呢最初是
有了封装,封装使得
或者说呢这个之后呢又产生了信息隐藏
的一种原则,封装呢使得数据和操作呢封装
合二为一,形成一个不可分割的整体,即对象。
这个当然呢在 最初的时候呢,它不是以对象的这种方式来
称呼这种封装体,而是称之为什么 称之为
module,也就是模块。
之后呢就又形成了这个信息隐藏的这么一种
机制,信息隐藏实际上是对封装的一个进一步地深化,封装的话就是说
上下文无关,只要封装了之后,所有的属性或者是操作,只能我对象自己使用,这样的话呢,
使得这个对象呢,向外发送信息交流这个便利条件呢,就不太
方便发生这个对外的信息交流。
为了使得 这个对象既能保持自己私有的一部分数据,又能够
比较方便的,或者说对某一类特定的对象
公开一部分信息的话,那就产生了信息隐藏的这么一种原则,也就是说我通过关键字来
标注,只要我这个对象标注不同的 关键字,这样表示它这个,这个属性或者这个操作呢,
可以被不同的对象所访问。
这是这个模块的观念逐步进化形成属于 隐藏,之后呢为了便于
多个线程或者说多个任务同时访问一个
模块,这样就产生了数据实例化这么一种机制,使得这个模块呢可以无穷多的产生自己的实例。
但是一旦它产生了,有了这三个原则之后,
这个就不再是模块的概念,而是称之为抽象数据类型的概念。
实际上呢,在早期的从面向 过程的编程语言到面向对象的编程语言中,这个过渡
的过程中,中间有很长的一个时间跨度,在这个过程中呢,产生了一些
它的抽象的一些原则比面向过程要高,但是又比面向对象低的这么一种
语言,也就是说它只能实现了现在面向对象的这些
面向对象方法学中的一些,这所有原则中的几个原则,
比如说它实现了封装,信息隐藏和实例化,比如说早期的一些 ADA 和 ALU 这些 编程语言。
但它不能是一种这个今天意义上的非常标准的面向对象的
编程语言,但是也不同于呢一些传统的面向过程的结构化的这种,所以这些语言呢
中呢,是只有抽象数据类型, 也就是说它只是不完整地实现了
面向对象中的几个原则,没有完全实现其他原则。
如果要完全过渡到纯粹的 或完整意义上的面向对象的编程语言呢,还需要后面的
在这个编译器中呢添加后面所讲到的一些其他的一些面向对象的原则。