object oriented program
物件导向程式设计维基百科,自由的百科全书(重定向自面向对象编程)
跳转到: 导览、 搜寻 本条目仅具有一部分地区的信息或观点,无法做到普世通用和完
整表达包含广泛区域的信息及观点。
请协助补充内容以避免偏颇,或讨论本文的问题。
编程范式
面向代理
基於元件
基於流
管道
连续式
并行计算
宣告式(对比:命令式)
函数式
资料流
面向细胞(电子试算表)
无功
面向图形
标的导向
约束
逻辑
回答集编程
约束逻辑
溯因逻辑
归纳逻辑
事件驱动
面向服务
时间驱动
功能导向
函式级(对比:价值级)
命令式(对比:宣告式)
非结构化
阵列(对比:纯量)
迭代式
结构化
程序式
模组化
递回式
物件导向
基於类别
基於原型
自动机
根据关注分离:
面向方面
面向主题
面向角色
超编程
面向属性
自动
泛型
模板
基於原则
面向语言
领域特定
面向语法
方言化
意图
反射式
不确定
并列计算
程序导向
大规模编程与小规模编程
价值级(对比:函式级)
--------------------------------------------------------------------------------
本模板: 检视 · 讨论 · 编辑
物件导向程式设计(英语:Object-oriented programming,缩写:OOP),指一种程式设
计典范,同时也是一种程式开发的方法。它将物件作为程式的基本单元,将程式和资料封
装其中,以提高软体的重用性、灵活性和扩充功能性。[1]
当我们提到物件导向的时候,它不仅指一种程式设计方法。它更多意义上是一种程式开发
方式。在这一方面,我们必须了解更多关於物件导向系统分析和物件导向设计(Object
Oriented Design,简称OOD)方面的知识。
目录 [隐藏]
1 概述
2 基本理论
2.1 类别
2.2 物件
2.3 方法(秩序;条例)
2.4 讯息传递机制
2.5 继承性
2.6 封装性
2.7 多型
2.8 抽象性
3 OOP名词释意
4 物件导向的语言
5 历史
5.1 脚本中的OOP
6 参考文献
7 相关内容
8 外部连结
[编辑] 概述物件导向程式设计的雏形,早在1960年的Simula语言中即可发现,当时的程
式设计领域正面临着一种危机:在软硬体环境逐渐复杂的情况下,软体如何得到良好的维
护?物件导向程式设计在某种程度上透过强调可重复性解决了这一问题。20世纪70年代的
Smalltalk语言在物件导向方面堪称经典——以至於30年後的今天依然将这一语言视为物
件导向语言的基础。
物件导向程式设计可以被视作一种在程式中包含各种独立而又互相呼叫的单位和物件的思
想,这与传统的思想刚好相反:传统的程式设计主张将程式看作一系列函式的集合,或者
直接就是一系列对电脑下达的指令。物件导向程式设计中的每一个物件都应该能够接受资
料、处理资料并将资料传达给其它物件,因此它们都可以被看作一个小型的「机器」,或
者说是负有责任的角色。
目前已经被证实的是,物件导向程式设计推广了程式的灵活性和可维护性,并且在大型项
目设计中广为应用。 此外,支持者声称物件导向程式设计要比以往的做法更加便於学习
,因为它能够让人们更简单地设计并维护程式,使得程式更加便於分析、设计、理解。反
对者在某些领域对此予以否认。
[编辑] 基本理论一项由 Deborah J. Armstrong 进行的长达40年之久的电脑着作调查显
示出了一系列物件导向程式设计的基本理论。它们是:
[编辑] 类别类别(Class)定义了一件事物的抽象特点。通常来说,类别定义了事物的属
性和它可以做到的(它的行为)。举例来说,「狗」这个类别会包含狗的一切基础特徵,
例如它的孕育、毛皮颜色和吠叫的能力。类别可以为程式提供模版和结构。一个类别的方
法和属性被称为「成员」。 我们来看一段虚拟码:
类别 狗
开始
私有成员:
孕育:
毛皮颜色:
公有成员:
吠叫():
结束
在这串代码中,我们宣告了一个类别,这个类别具有一些狗的基本特徵。关於公有成员和
私有成员,请参见下面的继承性一节。
[编辑] 物件物件(Object)是类别的例项。例如,「狗」这个类别列举狗的特点,从而
使这个类别定义了世界上所有的狗。而莱丝这个物件则是一条具体的狗,它的属性也是具
体的。狗有皮毛颜色,而莱丝的皮毛颜色是棕白色的。因此,莱丝就是狗这个类别的一个
例项。一个具体物件属性的值被称作它的「状态」。(系统给物件分配记忆体空间,而不
会给类别分配记忆体空间,这很好理解,类别是抽象的系统不可能给抽象的东西分配空间
,物件是具体的)
假设我们已经在上面定义了狗这个类别,我们就可以用这个类别来定义物件:
定义莱丝是狗
莱丝.毛皮颜色:=棕白色
莱丝.吠叫()
我们无法让狗这个类别去吠叫,但是我们可以让物件「莱丝」去吠叫,正如狗可以吠叫,
但没有具体的狗就无法吠叫。
[编辑] 方法(秩序;条例)方法(Method)是定义一个类别可以做的,但不一定会去做
的事。作为一条狗,莱丝是会叫的,因此「吠叫()」就是它的一个方法。与此同时,它可
能还会有其它方法,例如「坐下()」,或者「吃()」。 对一个具体物件的方法进行呼叫
并不影响其它物件,正如所有的狗都会叫,但是你让一条狗叫不代表所有的狗都叫。 如
下例:
定义莱丝是狗
定义泰尔是狗
莱丝.吠叫()
则泰尔是会叫——但没有吠叫,因为这里的吠叫只是对物件「莱丝」进行的。
[编辑] 讯息传递机制一个物件透过接受讯息、处理讯息、传出讯息或使用其他类别的方
法来实作一定功能,这叫做讯息传递机制(Message Passing)。
[编辑] 继承性继承性(Inheritance)是指,在某种情况下,一个类别会有「子类别」。
子类别比原本的类别(称为父类别)要更加具体化,例如,「狗」这个类别可能会有它的
子类别「牧羊犬」和「吉娃娃犬」。在这种情况下,「莱丝」可能就是牧羊犬的一个例项
。子类别会继承父类别的属性和行为,并且也可包含它们自己的。我们假设「狗」这个类
别有一个方法叫做「吠叫()」和一个属性叫做「毛皮颜色」。它的子类别(前例中的牧羊
犬和吉娃娃犬)会继承这些成员。这意味着程式设计师只需要将相同的代码写一次。 在
虚拟码中我们可以这样写:
类别牧羊犬:继承狗
定义莱丝是牧羊犬
莱丝.吠叫() /* 注意这里呼叫的是狗这个类别的吠叫方法。 */
回到前面的例子,「牧羊犬」这个类别可以继承「毛皮颜色」这个属性,并指定其为棕白
色。而「吉娃娃犬」则可以继承「吠叫()」这个方法,并指定它的音调高於平常。子类别
也可以加入新的成员,例如,「吉娃娃犬」这个类别可以加入一个方法叫做「颤抖()」。
设若用「牧羊犬」这个类别定义了一个例项「莱丝」,那麽莱丝就不会颤抖,因为这个方
法是属於吉娃娃犬的,而非牧羊犬。事实上,我们可以把继承理解为「是」。例如,莱丝
「是」牧羊犬,牧羊犬「是」狗。因此,莱丝既得到了牧羊犬的属性,又继承了狗的属性
。 我们来看虚拟码:
类别吉娃娃犬:继承狗
开始
公有成员:
颤抖()
结束
类别牧羊犬:继承狗
定义莱丝是牧羊犬
莱丝.颤抖() /* 错误:颤抖是吉娃娃犬的成员方法。 */
当一个类别从多个父类别继承时,我们称之为「多重继承」。多重继承并不总是被支援的
,因为它很难理解,又很难被好好使用。
[编辑] 封装性具备封装性(Encapsulation)的物件导向程式设计隐藏了某一方法的具体
执行步骤,取而代之的是透过讯息传递机制传送讯息给它。因此,举例来说,「狗」这个
类别有「吠叫()」的方法,这一方法定义了狗具体该透过什麽方法吠叫。但是,莱丝的朋
友蒂米并不需要知道它到底如何吠叫。 从例项来看:
/* 一个程序导向的程式会这样写: */
定义莱丝
莱丝.设定音调(5)
莱丝.吸气()
莱丝.吐气()
/* 而当狗的吠叫被封装到类别中,任何人都可以简单地使用: */
定义莱丝是狗
莱丝.吠叫()
封装是透过限制只有特定类别的例项可以存取这一特定类别的成员,而它们通常利用介面
实作讯息的传入传出。举个例子,介面能确保幼犬这一特徵只能被赋予狗这一类别。通常
来说,成员会依它们的存取许可权被分为3种:公有成员、私有成员以及保护成员。有些
语言更进一步:Java可以限制同一包内不同类别的存取;C#和VB.NET保留了为类别的成员
聚集准备的关键字:internal(C#)和Friend(VB.NET);Eiffel语言则可以让使用者指
定哪个类别可以存取所有成员。
[编辑] 多型多型(Polymorphism)是指由继承而产生的相关的不同的类别,其物件对同
一讯息会做出不同的响应。[2]举例来说,狗和鸡都有「叫()」这一方法,但是呼叫狗的
「叫()」,狗会吠叫;呼叫鸡的「叫()」,鸡则会啼叫。 我们将它体现在虚拟码上:
类别狗
开始
公有成员:
叫()
开始
吠叫()
结束
结束
类别鸡
开始
公有成员:
叫()
开始
啼叫()
结束
结束
定义莱丝是狗
定义鲁斯特是鸡
莱丝.叫()
鲁斯特.叫()
这样,同样是叫,莱丝和鲁斯特做出的反应将大不相同。多型性的概念可以用在运算子过
载上,本文不再赘述。
[编辑] 抽象性抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到
最恰当的类别定义,并且可以在最恰当的继承级别解释问题。举例说明,莱丝在大多数时
候都被当作一条狗,但是如果想要让它做牧羊犬做的事,你完全可以呼叫牧羊犬的方法。
如果狗这个类别还有动物的父类别,那麽你完全可以视莱丝为一个动物。
[编辑] OOP名词释意编程典范 对於OOP的准确定义及其本意存在着不少争论。
通常,OOP被理解为一种将程式分解为封装资料及相关操作的模组而进行的编程方式。有
别於其它编程方式,OOP中的与某资料型别相关的一系列操作都被有机地封装到该资料型
别当中,而非散放於其外,因而OOP中的资料型别不仅有着状态,还有着相关的行为。OOP
理论,及与之同名的OOP实践相结合创造出了新的一个编程架构;OOP思想被广泛认为是非
常有用的,以致一套新的编程典范被创造了出来。(其它的编程典范例如函数语言程式设
计或程序式编程专注於程式执行的过程,而逻辑编程专注於引发程式代码执行的断言)
对面向类比系统的语言(如:SIMULA 67)的研究及对高可靠性系统架构(如:高效能作
业系统和CPU的架构)的研究最终导致了OOP的诞生。
[编辑] 物件导向的语言支援部分或绝大部分物件导向特性的语言即可称为基於物件的或
物件导向的语言。
早期,完全物件导向的语言主要包括Smalltalk等语言,目前较为流行的语言中有Java、
C#、Eiffel等。随着软体工业的发展,比较早的程序导向的语言在近些年的发展中也纷纷
吸收了许多物件导向的概念,比如C->C++,C->Objective-C,BASIC->Visual
Basic->Visual Basic .NET,Pascal->Object Pascal,Ada->Ada95。
[编辑] 历史电脑科学中物件和例项概念的最早萌芽可以追溯到麻省理工学院的PDP-1系统
。这一系统大概是最早的基於容量架构(capability based architecture)的实际系统
。另外1963年Ivan Sutherland的Sketchpad应用中也蕴含了同样的思想。物件作为编程实
体最早是於1960年代由Simula 67语言引入思维。Simula这一语言是奥利-约翰·达尔和克
利斯登·奈加特在挪威奥斯陆电脑中心为类比环境而设计的。(据说,他们是为了类比船
只而设计的这种语言,并且对不同船只间属性的相互影响感兴趣。他们将不同的船只归纳
为不同的类别,而每一个物件,基於它的类别,可以定义它自己的属性和行为。)这种办
法是分析式程式的最早概念体现。在分析式程式中,我们将真实世界的物件对映到抽象的
物件,这叫做「类比」。Simula不仅引入了「类别」的概念,还应用了例项这一思想——
这可能是这些概念的最早应用。
20世纪70年代全录PARC研究所发明的Smalltalk语言将物件导向程式设计的概念定义为,
在基础运算中,对物件和讯息的广泛应用。Smalltalk的建立者深受Simula 67的主要思想
影响,但Smalltalk中的物件是完全动态的——它们可以被建立、修改并销毁,这与
Simula中的静态物件有所区别。此外,Smalltalk还引入了继承性的思想,它因此一举超
越了不可建立例项的程式设计模型和不具备继承性的Simula。
此外,Simula 67的思想亦被应用在许多不同的语言,如Lisp、Pascal。
物件导向程式设计在80年代成为了一种主导思想,这主要应归功於C++——C语言的扩充版
。在图形化使用者介面(GUI)日渐崛起的情况下,物件导向程式设计很好地适应了潮流
。GUI和物件导向程式设计的紧密关联在Mac OS X中可见一斑。Mac OS X是由Objective-C
语言写成的,这一语言是一个仿Smalltalk的C语言扩充版。物件导向程式设计的思想也使
事件处理式的程式设计更加广泛被应用(虽然这一概念并非仅存在於物件导向程式设计)
。一种说法是,GUI的引入极大地推动了物件导向程式设计的发展。
苏黎世联邦理工学院的尼克劳斯·维尔特和他的同事们对抽象资料和模组化程式设计进行
了研究。Modula-2将这些都包括了进去,而Oberon则包括了一种特殊的物件导向方法——
不同於Smalltalk与C++。
物件导向的特性也被加入了当时较为流行的语言:Ada、BASIC、Lisp、Fortran、Pascal
以及种种。由於这些语言最初并没有物件导向的设计,故而这种糅合常常会导致相容性和
维护性的问题。与之相反的是,「纯正的」物件导向语言却缺乏一些程式设计师们赖以生
存的特性。在这一大环境下,开发新的语言成为了当务之急。作为先行者,Eiffel成功地
解决了这些问题,并成为了当时较受欢迎的语言。
在过去的几年中,Java语言成为了广为应用的语言,除了它与C和C++语法上的近似性。
Java的可移植性是它的成功中不可磨灭的一步,因为这一特性,已吸引了庞大的程式设计
师群的投入。
近日,一些既支援物件导向程式设计,又支援程序导向程式设计的语言悄然浮出水面。它
们中的佼佼者有Python、Ruby等等.
正如程序导向程式设计使得结构化程式设计的技术得以提升,现代的物件导向程式设计方
法使得对设计模式的用途、契约式设计和建模语言(如UML)技术也得到了一定提升。
[编辑] 脚本中的OOP近年来,物件导向的程式设计越来越流行於指令码语言中。Python和
Ruby是建立在OOP原理的指令码语言,Perl和PHP亦分别在Perl 5和PHP 4时加入物件导向
特性。
--
plurk
http://www.plurk.com/dasea2017
face book
0911457604,0934169099
google+
https://plus.google.com/u/0/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.58.22.74
※ 编辑: dasea2008 (210.66.169.48 台湾), 04/26/2021 05:31:52
※ 编辑: dasea2008 (101.0.228.86 台湾), 04/11/2022 23:30:19