您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 基于Objective-C的面向对象编程
概述本部分包含如下内容:谁应该阅读本文档本文档的组织结构参考面向对象的开发方法使得程序开发更加直观、快捷,程序更容易被重构、理解。大多数面向对象开发环境至少由以下三个部分组成:对象库开发工具集支持面向对象的编程语言和相应的类库Objective-C是一种设计用来支持面向对象开发的简洁的计算机语言,它是标准C语言的一个很小但是很强大的超集。除了C之外,Objective-C主要基于Smalltalk,昀早的面向对象的编程语言之一。Objective-C以一种简单和直接的方式使得C语言具有了面向对象的能力。如果您以前从来没有使用过面向对象的方法开发程序,本文档则能够帮助您熟悉面向对象的开发技术。它阐述了面向对象设计的意义,以及如何开发面向对象的程序.谁应该阅读本文档本文档的阅读对象为对如下几个方面感兴趣的读者:面向对象编程Cocoa应用程序框架的基础Objective-C编程本文档介绍了Objective-C所基于的面向对象模型。本文档不是C语言的介绍文档,所以假设您已具备C语言的相关知识。然而,您无需为您不是一个熟练的C程序员而担心,因为Objective-C的面向对象编程和基于过程的标准C的编程有很大不同。重要:本文档只是描述了对于使用Objective-C编程来说很重要的一些基础概念,并没有对Objective-C语言本身做过多的叙述,如果您对Objective-C语言感兴趣,请参考Objective-C2.0程序设计语言。本文档的结构本文档分为如下几个章节:“为何是Objective-C?”解释了为什么选择Objective-C作为Cocoa框架的开发语言。“面向对象编程”讨论了面向对象编程的基本原理,并阐述了面向对象技术背后的思想,介绍了大量的专门术语。即使您已经对面向对象编程非常熟悉,也推荐您阅读一下该章节,从而对面向对象的Objective-C和使用的术语有一个感性认识。“对象模型”“程序的组织结构”“结构化编程”参考Objective-C2.0程序设计语言介绍了Objective-C编程语言。Objective-C2.0运行时系统编程指南描述了怎样和Objective-C运行时系统交互。Objective-C2.0运行时系统参考库介绍了Objective-C运行时系统库的数据结构和函数。您的程序可以使用这些接口来和Objective-C运行时系统进行交互。例如,你可以增加类或者方法,或者获取所有已经加载的类的类定义表单。为何是Objective-C?Cocoa框架选择了Objective-C作为开发语言有许多方面的原因。首先,也是昀主要的原因,它是一个面向对象的语言。Cocoa框架中的很多功能只能通过面向对象的技术来呈现,本文档将对Cocoa框架的功能进行具体阐述并介绍怎样使用它们。其次,是标准C语言的一个超集,现存的C程序无需重新开发就能够使用Cocoa软件框架,并且您可以在Objective-C中使用C的所有特性。您可以选择什么时候采用面向对象的编程方式(例如定义一个新的类),什么时候使用传统的面向过程的编程方式(定义数据结构和函数而不是类)。此外,Objective-C是一个简洁的语言,它的语法简单,没有歧义,并且易于学习。因为易于混淆的术语以及抽象设计的重要性,对于初学者来说,面向对象编程的学习曲线比较陡峭。象Objective-C这种结构良好的语言使得成为一个熟练的面向对象程序员更为容易。介绍Objetive-C的章节也如同其语言本身一样简洁。和其他的基于标准C语言的面向对象语言相比,Objective-C对动态机制支持得更为彻底。编译器为运行环境保留了很多对象本身的数据信息,因此某些在编译时需要做出的选择就可以推迟到运行时来决定。这种特性使得基于Objective-C的程序非常灵活和强大。例如,Objective-C的动态机制提供了两个一般面向对象语言很难提供的优点:Objective-C支持开放式的动态绑定,从而有助于交互式用户接口架构的简单化。例如,在Objective-C中发送消息既无需考虑消息接收者的类也不用考虑方法的名字,从而可以允许用户在运行时再做出决定,也给了开发者在设计时极大的自由(术语“动态绑定”,“消息“,“消息接收者”,“类”将在随后的章节中进行介绍)。Objective-C的动态机制成就了各种复杂的开发工具。运行环境提供了访问运行中程序数据的接口,所以使得开发工具监控Objective-C程序成为可能。注意:作为编程语言来说,Objective-C有很悠久的历史。它在二十世纪八十年代早期被发明于Stepstone公司,作者是BradCox和TomLove。八十年代后期,NeXT计算机有限责任公司获得了使用Objective-C来开发NeXTStep框架的授权,也就是后来的Cocoa。NeXT在多方面对Objective-C进行了扩展,例如协议部分。面向对象编程技术在现实生活中,我们必须弄明白我们所面对的大量的事实以及观念。为此,我们需要从表面细节中抽象出其内在逻辑,发现事物的本质。抽象法可以帮助我们揭示事物的因果,结构和表现形式,区分主要和次要。面向对象编程提供了一种对您所操作的数据进行抽象的方法—而且,面向对象编程将数据和对数据的操作组合到一起,从而使数据具有了行为。本部分包含如下内容:数据和操作接口和实现数据和操作传统的编程语言通常划分成两个部分—数据和对数据的操作。数据是静态的,不变的,除非通过操作来改变它。对数据操作的函数并不保留上一次操作时数据的状态,它们的作用仅体现在操作数据上。很明显,这种划分是基于计算机的工作方式,所以您很难忽视它。和无处不在的原料和能量以及名词和动词的划分一样,它构成了程序的本质。从某种意义上说,所有的程序员—即使是面向对象的程序员—都是工作在数据结构之上,他们的程序也会使用和定义函数来操作数据。对于面向过程编程语言例如C来说,这几乎就是一切了。语言本身可能为组织数据和函数提供了多种支持,但是本质上仍然是分成数据和操作两个部分。函数和数据结构是设计的基本元素。面向对象编程当然不会这样来划分,而是在更高的层次重新组织。它把操作和数据组合为一个模块单元叫做对象,并且把对象组成一个结构化的网络来完成一个程序。在面向对象的编程语言中,对象和对象间的交互才是设计的基本元素。每个对象都具有状态(数据)和行为(对数据的操作)。也就是说,它们和物理实体并没有太大区别。一台机械装置例如怀表、钢琴如何体现自己的状态和行为是显而易见的,然而几乎每样功能性的物体都能够体现自己的状态和行为。即使一个普通的瓶子也会有状态(饼子有多满,瓶子是否已经打开,瓶子所装的液体温度多少)和行为(以不同的流量倒出所装液体,盖上或者打开,加热或者制冷)。正是这种与实物的相似性赋予了对象强大的能力和吸引力。这些对象不仅可以对现实系统的组件建模,也能够胜任软件系统中的同样的角色。接口和实现编写一个程序,您需要对问题进行抽象,并使用程序将其表达出来。这正是编程语言帮您做的工作。编程语言可以帮助您对抽象后的问题进行编码从而使得程序的编写和设计过程更为简单。它使您只用关注您所写的代码和程序的架构而无需关心表面的细节。所有的程序语言都提供了对抽象后的问题进行编码的方法。本质上,这些方法就是怎样分离并隐藏实现细节,然后至少在某种程度上,提供给这些细节一个公共的接口—就像机械装置将它的表面和内部的构造分离一样—如图接口和实现所示。图2-1接口和实现随着对该装置的观察角度不同,您所关注的层面也不同。作为一个实现者,您需要关心它是由什么构成并且怎样工作的。作为一个用户,您仅需要关心它是什么并且它能够做什么。您可以略过那些具体的细节而从更高层次来考虑问题。在C语言中,程序的基本单位是结构体和函数,这两者从不同的方面隐藏了具体实现细节。从数据方面,C中的结构体把数据组合成一个更大的单位从而可以象一个单独的实体一样对它进行操作。尽管有时候代码需要访问结构体内部的数据,但程序一般都将结构体作为一个单独的数据实体来对待—而不是数据的集合。结构体能包含另一个结构体,从而组成复杂的数据结构。在现代C语言中,结构体中的数据元素位于该结构体的名字空间—也就是说,结构体内的元素名字不会和结构体外的同名元素冲突。划分名字空间对保证实现细节和接口的分离来说是非常必要的。例如,试想一下,在一个大规模的程序中给每个数据元素赋予一个不同的名字并且保证新的命名不会和已存在的命名冲突是一件多么巨大的工作。从过程方面,函数封装了一些可以重复使用而不用重新实现的行为(操作)。和结构体的数据元素一样,函数中局部变量也处于该函数自己的名字空间。函数可以调用其他的函数,从而组成复杂的逻辑。函数是可复用的。一旦函数被定义,则可以不限次的调用而无需再重新实现。一些被广泛使用的函数可能被收集在函数库中并且在不同的应用程序中被重用。用户只需要函数的接口,而不需要知道函数的实现。然而,和结构体中数据元素不同的是,函数并没有划分不同的名字空间。每个函数的名字必须唯一。尽管函数是可复用的,但函数名不是。C语言中的结构体和函数都能够帮助您对问题进行抽象,但是它们仍然区分了数据和对数据的操作。在面向过程的编程语言中,问题要么被抽象成数据,要么被抽象成操作。您的程序总是按照计算机的工作方式去设计。面向对象的语言没有抛弃结构体和函数的优点—它更深入了一步,将问题抽象成更高层次的单位,从而隐藏了函数和数据之间的交互。例如,假设您有一组函数(接口)作用于某个特定的数据结构。您希望这些数据结构和接口无关从而使得这些函数尽可能的易于使用,所以提供了一些额外的函数来管理这些数据。所有对该数据结构的操作—分配内存空间,初始化,获取数据,更改数据,更新数据,释放内存空间—都通过这些额外的函数来进行。用户所需要做的只是以该数据结构为参数调用这些函数。这样,该数据结构对其他的程序员来说是不透明的,他们无需关心该数据结构的内部构成,从而专注于函数的功能,而不是该数据结构。到现在为止,您已经完成了创建对象的第一步。下一步就是在编程语言中支持这一想法并且完全隐藏掉数据结构从而无需在函数中作为参数来回传递。该数据结构成为一个内部的实现细节,暴露给用户的是函数接口。因为对象完全封装(隐藏)了内部数据,所以用户只用考虑对象的行为。有了这一步,这些函数的接口变得更为简单。调用者无需知道函数是怎么实现的(使用了什么数据)。现在我们可以把它称之为”对象“。被隐藏的数据结构把所有的访问自己的函数联合在一起。所以,一个对象不是一些随机选择的函数的集合,而是数据结构支持的一组相关的行为。要使用一个对象的函数,您必须首先创建一个对象(从而分配了内部数据结构),然后告诉这个对象执行哪个函数。从这时开始,您只需考虑这个对象能做什么,而不用单独的考虑这些函数能做什么。从函数和数据结构到对象行为的过程就是学习面向对象编程的精髓。可能一开始有点不习惯,但如果您有了一定的面向对象编程经验后,您会发现面向对象更符合我们思考问题的自然方式。日常的编程术语中充满了对现实世界的模拟—表单,容器,表格,控制器,甚至管理者,将这些做为程序对象来实现也是自然而然的事情。不同的编程语言对问题抽象的方式也不同。您不应关心和当前问题无关的细节。例如,如果您总是要求相应的过程必须处理相应的数据,则您将需要知道底层的实现细节。尽管您仍然可以在更高的层次抽象问题,然而,从设计到实现的区别可能变得很细微—而且程序规模越大,越复杂,则设计越困难。通过对问题不同层次的抽象,面向对象语言向您提供了更大的词汇表和更丰富的编程模型。对象模型面向对象编程就是在比较高的层次上把状态和行为——数据和对数据的操作——组合到对象中,并且提供了编程语言上的支持。对象就是一组相关的函数和为这些函数服务的数据的集合。这些函数被称为对象的方法,数据被称为对象的实例变量。对象方法封装了对实例变量的访问,实例变量在对象之外是不可见的,如图3-1所示:图3-1对象如果您曾经应付过一些比较棘手的编程问题,您的程序中可能已经有类似的设计——一组相
本文标题:基于Objective-C的面向对象编程
链接地址:https://www.777doc.com/doc-4815654 .html