한국   대만   중국   일본 
面向?象程序?? - ?基百科,自由的百科全? 跳?到?容

面向?象程序??

本页使用了标题或全文手工转换
?基百科,自由的百科全?
(重定向自 面向?象?程
「面向?象程序??」的各地常用名稱
中?大陸 面向?象程序??
臺灣 物件導向程式設計
港澳 物件導向程式設計

物件導向程式設計 (英語: Object-oriented programming ?? OOP )是種具有 物件 ?念的 程式設計典範 ,同?也是一?程式??的抽象方?。?可能包含 資料 特性 程式碼 方法 。?象則指的是 類別 (class)的?例。?? ?象 作? 程序 的基本?元,?程序和 ?据 封? 其中,以提高?件的重用性、?活性和?展性,物件裡的程序可以訪問及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件 [1] [2]

面向?象程序??可以看作一?在程序中包含各??立而又互相?用的?象的思想,????的思想?好相反:??的程序??主??程序看作一系列 函? 的集合,或者直接就是一系列???下?的指令。面向?象程序??中的每一??象都??能?接受?据、?理?据???据???其??象,因此??都可以被看作一?小型的“机器”,??象。目前已?被??的是,面向?象程序??推?了程序的?活性和可??性,?且在大型?目??中???用。此外,支持者??面向?象程序??要比以往的做法更加便于??,因??能??人?更??地?????程序,使得程序更加便于分析、??、理解。反?者在某些?域?此予以否?。

?我?提到面向?象的?候,?不?指一?程序??方法。?更多意?上是一?程序??方式。在?一方面,我?必?了解更多?于 面向?象系?分析 面向?象?? (Object Oriented Design,??OOD)方面的知?。許多流行的程式語言是物件導向的,?們的風格就是會透由物件來創出實例。

重要的物件導向程式語言包含 Common Lisp Python C++ Objective-C Smalltalk Delphi Java Swift C# Perl Ruby JavaScript PHP 等。

特徵 [ ?? ]

物件導向程式編程的定義是使用「物件」來做設計,但?非所有的程式語言都直接支援「物件導向程式編程」相關技術與結構。?于OOP的准?定?及其本意存在着不少??。通常,OOP被理解?一??程序分解?封??据及相?操作的模?而?行的?程方式。有?于其??程方式,OOP中的?某?据?型相?的一系列操作都被有机地封?到??据?型?中,而非散放于其外,因而OOP中的?据?型不?有着??,?有着相?的行?。

面向?象的?建要素由三?部分?成,?例、?和元?据,元?据?存??建所需要的一切信息。??系上看,???例?一?多?系,?和元?据?一?一?系,?例?指向?,??指向元?据,???系最??成了所有面向?象的基?( object )。

OOP理?,及?之同名的OOP??相?合?造出了新的一??程架?;OOP思想被?泛??是非常有用的,以致一套新的 ?程范型 被?造了出?。(其?的 ?程范型 例如函?式?程或?程式?程?注于程序?行的?程,而???程?注于引?程序代??行的?言)。?面向模?系?的?言(如:SIMULA 67)的?究及?高可?性系?架?(如:高性能操作系?和CPU的架?)的?究最??致了OOP的?生。其中由 Deborah J. Armstrong ?行的??40年之久的?算机著作??中,?示出了一系列面向?象程序??的基本理?。物件導向程式特徵被條列如下 [3] [4] [5] [6]

分享非物件導向程式前身語言 [ ?? ]

物件導向程式設計通常共享高階編程語言的低階功能。可用於建構一個程序的基本工具包括:

類與?象 [ ?? ]

支持面向?象編程語言通常利用 繼承 其他類達到代碼重用和可擴展性的特性。而類有兩個主要的?念:

  • (Class):定義了一件事物的抽象特點。類的定義包含了數據的形式以及對數據的操作。
  • ?象 (Object):是類的實例(Instance)。

其中 ? (Class)定?了一件事物的抽象特点。?的定?包含了?据的形式以及??据的操作。?例??,“犬”????包含犬的一切基?特征,?所有“犬”都共有的特征或行?,例如?的品?、毛皮?色和吠叫的能力。?可以?程序提供模版和??。一??的方法和?性被??“ 成? ”。 我??看一段 ?代?

?

?始
  公有成?:
    吠():
  私有成?:
    毛色:
    品?:
?束

在?串代?中,我??明了一??,???具有一些犬的基本特征。?于 公有成? 私有成? ,???下面的?承性的?容。

?象 (Object)是?的 ?例 。物件有時會對應到現實世界中的事物,?例來說,一個圖形程式可能有圓形、矩形與?面等物件,一個線上購物系統可能有購物車、顧客與?品等類別。 [7] 。有時?象會表示更抽象的實體,比如一個被開?的?案或是一個提供美國慣用量測轉換的服務。每個?象就是一個特定類別的實例(例如,名稱是“李?”的物件可能是類別雇員的一個實例)。程序在面向?象編程當中被視?方法,變數被視?成員或屬性。例如,“犬”???列?犬的特点,?而使???定?了世界上所有的犬。而大????象?是一?具?的犬,?的?性也是具?的。犬有毛色,而大?的毛色是?色的。因此,大?就是犬???的一??例。一?具??象?性的?被?作?的“ ?? ”。(系???象分配?存空?,而不???分配?存空?。??好理解,?是抽象的,系?不可能?抽象的?西分配空?,而?象?是具?的。)

假?我?已?在上面定?了犬???,我?就可以用????定??象:

定?
大?

大?.毛色 : ?
大?.吠()

我?无法?犬???去吠,但是我?可以??象“大?”去吠,正如狗可以吠,但?有具?的狗就无法吠。

?和?象就好比是“?型”和“1.23”,“?型”是一??据的?型,而“1.23”是一??正的“??”(??象)。所有的“??”都具有“?型”所描?的特征,如“??的大小”,系??分配?存?“??”存?具?的??。

動態配置與訊息傳遞機制 [ ?? ]

定義上 動態配置 是指方法會隨著實例動態的改變。而 訊息傳遞機制 (Message Passing)是指一個物件通過接受訊息、處理訊息、傳出訊息或使用其他類別的方法來實作一定功能。如: 大? 可以通? 引起 的注意,?而?致一系列的事?生。

封裝性 [ ?? ]

具備 封裝性 (Encapsulation)的物件導向程式設計隱藏了某一方法的具體執行步驟,取而代之的是通過訊息傳遞機制傳送訊息給?。封裝是通過限制只有特定類別的物件可以存取這一特定類別的成員,而?們通常利用介面實作訊息的傳入傳出。??例子,接口能?保幼犬?一特征只能被?予犬?一?。通常來說,成員會依?們的存取權限被分?3種: 公有成員 私有成員 以及 保護成員 。有些語言更進一步: Java 可以限制同一包內不同類別的存取; C# VB.NET 保留了?類別的成員聚集準備的關鍵字:internal(C#)和Friend(VB.NET);Eiffel語言則可以讓使用者指定?個類別可以存取所有成員。

因此,?例??,“犬”???有“吠()”的方法,?一方法定?了犬具??通?什?方法吠。但是,大?的朋友?不知道?到底是如何吠的。

??例?看:

/* 一?面向?程的程序????: */
定?
大?

大?.定音(442)
大?.吸?()
大?.吐?()

/* 而?狗的吠叫被封?到?中,任何人都可以??地使用: */
定?
大?

大?.吠()

?承 [ ?? ]

?承性 (Inheritance)是指,在某?情?下,一???有“ 子? ”。子?比原本的?(?? 父? )要更加具?化。例如,“ ”???可能?有?的 子? 中?田?犬 ”和“ 牧羊犬 ”。在??情?下,“大?”可能就是中?田?犬的一? ?例 。子???承父?的 ?性 英? Attribute (computing) 行? ,?且也可包含??自己的。我?假?“犬”???有一? 方法 (行?)叫做“吠()”和一??性叫做“毛色”。?的子?(前例中的中?田?犬和牧羊犬)??承?些成?。?意味着程序?只需要?相同的代??一次。

在?代?中我?可以???:

?
中?田?犬
 : ?承


定?
大?
中?田?犬

大?.吠()    /* 注?:注意?里?用的是狗???的吠叫方法。*/

回到前面的例子,“中?田?犬”???可以?承“毛色”???性,?指定其??色。而“牧羊犬”?可以?承“吠()”??方法,?指定?的音?。子?也可以加入新的成?,例如,“牧羊犬”???可以加入一?方法叫做“放牧()”。?若用“中?田?犬”???定?了一??例“大?”,那?大?就不?放牧,因???方法是?于牧羊犬的,而非中?田?犬。事?上,我?可以把?承理解?“是”或“?于”。大?“是”中?田?犬,中?田?犬“?于”犬?。因此,大??得到了中?田?犬的?性,又?承了犬的?性。 我??看?代?:

?
牧羊犬
 : ?承

?始
  公有成?:
    放牧()
?束
?
中?田?犬
 : ?承


定?
大?
中?田?犬

大?.放牧()    /* 注?:??:放牧是牧羊犬的成?方法。 */

?一???多?父??承?,我??之?“ 多重?承 ”。如一只狗?是中?田?犬又是牧羊犬。多重?承?不?是被支持的,因????理解,又??被好好使用。

多型 [ ?? ]

多型 (Polymorphism)是指由?承而?生的相?的不同的?,其?象?同一消息?做出不同的?? [8] 。例如,狗和?都有“叫()”?一方法,但是?用狗的“叫()”,狗?吠叫;?用?的“叫()”,???啼叫。 我?????在?代?上:

?

?始
  公有成?:
    叫()
    ?始
      吠()
    ?束
?束

?
?

?始
  公有成?:
    叫()
    ?始
      啼()
    ?束
?束

定?
大?

定?
?帽
?

大?.叫()
?帽.叫()

??,?然同?是做出 ?一?行?,但大?和?帽具?做出的表?方式?大不相同。多?性的?念可以用在 ?算符重? 上,可以根据需求?看相?界面。

抽象性 [ ?? ]

抽象 (Abstraction)是?化??的????的途?,?可以?具????到最恰?的?定?,?且可以在最恰?的?承??解???。?例?明,大?在大多??候都被?作一?狗,但是如果想要??做中?田?犬做的事,?完全可以?用中?田?犬的方法。如果狗????有 ?物 的父?,那??完全可以?大???物。

?史 [ ?? ]

面向?象程序??的?形,早在1960年代的 Simula ?言中?可??,??的 程序?? ?域正面?着一?危机:在?硬件?境逐???的情?下,?件如何得到良好的???面向?象程序??在某?程度上通?强? 可重?性 解?了?一??。20世?70年代的 Smalltalk?言 在面向?象方面堪??典??以至于30年后的今天依然??一?言??面向?象?言的基?。

?算机科?中?象和?例?念的最早萌芽可以追溯到 麻省理工?院 PDP-1 系?。?一系?大?是最早的基于容量架?(capability based architecture)的??系?。?外1963年Ivan Sutherland的 Sketchpad ?用中也?含了同?的思想。?象作??程??最早是于1960年代由 Simula 67 ?言引入思?。Simula?一?言是 奧利-約翰·達爾 克利斯登·奈加特 ?斯? ?威?算中心 英? Norwegian Computing Center ?模??境而??的。(据?,他?是?了模?船只而??的???言,?且?不同船只??性的相互影?感?趣。他??不同的船只???不同的?,而每一??象,基于?的?,可以定??自己的?性和行?。)???法是分析式程序的最早?念??。在分析式程序中,我????世界的?象映射到抽象的?象,?叫做“模?”。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 )技?也得到了一定提升。

物件導向編程語言 [ ?? ]

支持部分或?大部分面向?象特性的?言?可??基于?象的或面向?象的?言。 Simula (1967)被視?第一個具有物件導向特性的語言。早期,完全面向?象的?言主要包括 Smalltalk 等?言,目前??流行的?言中有 Java C# Eiffel 等。?着?件工?的?展,比?早的程序導向的?言在近些年的?展中也??吸收了?多物件導向的?念,比如 C C++ ,C→ Objective-C BASIC Visual Basic Visual Basic .NET Pascal Object Pascal Ada Ada95 。「純粹」的物件導向語言, 因?所有的東西都是由物件所組成,例如: Eiffel , Emerald , [9] JADE , Obix , Ruby , Scala , Smalltalk , Self .

?本中的OOP [ ?? ]

近年來,面向?象的程序??越?越流行于 脚本?言 中。 Python Ruby 是建立在OOP原理的脚本語言, Perl PHP 亦分別在Perl 5和PHP 4時加入物件導向特性。

參見 [ ?? ]

參考文獻 [ ?? ]

  1. ^ Kindler, E.; Krivy, I. Object-Oriented Simulation of systems with sophisticated control. International Journal of General Systems: 313?343. 2011.  
  2. ^ Lewis, John; Loftus, William. Java Software Solutions Foundations of Programming Design 6th ed. Pearson Education Inc. 2008. ISBN  0-321-53205-8 .   , section 1.6 "Object-Oriented Programming"
  3. ^ Deborah J. Armstrong. The Quarks of Object-Oriented Development . A survey of nearly 40 years of computing literature which identified a number of fundamental concepts found in the large majority of definitions of OOP, in descending order of popularity: Inheritance, Object, Class, Encapsulation, Method, Message Passing, Polymorphism, and Abstraction.
  4. ^ John C. Mitchell , Concepts in programming languages , Cambridge University Press, 2003, ISBN 0-521-78098-5 , p.278. Lists: Dynamic dispatch, abstraction, subtype polymorphism, and inheritance.
  5. ^ Michael Lee Scott, Programming language pragmatics , Edition 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1 , p. 470. Lists encapsulation, inheritance, and dynamic dispatch.
  6. ^ Pierce, Benjamin. Types and Programming Languages . MIT Press. 2002. ISBN  0-262-16209-1 .   , section 18.1 "What is Object-Oriented Programming?" Lists: Dynamic dispatch, encapsulation or multi-methods (multiple dispatch), subtype polymorphism, inheritance or delegation, open recursion ("this"/"self")
  7. ^ Booch, Grady. Software Engineering with Ada . Addison Wesley. 1986: 220 [ 2016-03-06 ] . ISBN  978-0805306088 . (原始?容 存? 于2021-05-14). Perhaps the greatest strength of an object-oriented approach to development is that it offers a mechanism that captures a model of the real world.  
  8. ^ ?浩强 :《C++面向?象程序??》,??大?出版社,2006年1月第一版。 ISBN 978-7-302-12315-6
  9. ^ The Emerald Programming Language . 2011-02-26 [ 2016-03-06 ] . (原始?容 存? 于2021-04-21).  

延伸閱讀 [ ?? ]

外部連結 [ ?? ]