2008-08-26 58 views
30

由於沒有有意義的術語的辯論是meaningless,我想我會指着房間裏的大象問:究竟是什麼使語言成爲「面向對象」?我不在這裏尋找教科書的答案,而是根據您在您的領域中運行良好的OO語言的經驗,無論它是什麼。什麼使語言成爲面向對象的?

可能有助於首先回答的相關問題是:面嚮對象語言的原型是什麼?爲什麼?

回答

27

Definitions for Object-Orientation當然是一個huge can of worms,但這裏是我的2美分:

對我來說, OBJ ect-Orientation全部是關於通過發送消息進行協作的對象。就我而言,這是面嚮對象語言的一個最重要的特徵。

如果我不得不忍受的所有功能的有序列表,一個面向對象的語言必須具備的,它應該是這樣的:

  1. Objects sending messages to other objects
  2. 一切都是對象
  3. Late Binding
  4. Subtype Polymorphism
  5. 繼承或類似表達的東西,如Delegation
  6. Encapsulation
  7. Information Hiding
  8. 抽象

顯然,這份名單是很有爭議的,因爲它排除了種類繁多的語言被廣泛認爲是面向對象的,如JavaC#C++,所有這些都違反了第1,2和3點。然而,毫無疑問,這些語言允許面向對象的編程(但是C也是如此),甚至有利於它(C不支持)。所以,我來調用滿足這些要求的語言「純粹面向對象」。

作爲典型的面向對象的語言,我會命名爲SelfNewspeak

兩者都滿足上述要求。兩者都受到Smalltalk的啓發和接班人的支持,在某種意義上,兩者實際上都成爲「更多OO」。我喜歡Self和Newspeak的東西,都是將信息發送範式推向極致(Newspeak比Self更重要)。

In Newspeak,everything是一條消息發送。沒有實例變量,沒有字段,沒有屬性,沒有常量,沒有類名。它們都是通過使用getter和setter來模擬的。

在自我,有沒有類,只有對象。這強調,什麼OO是真的約:對象,而不是類。

+1

消息,後期綁定和多態是同樣的事情:一個早期綁定的消息只是一個過程調用,如果你不能將相同的消息發送給不同類型的對象,那爲什麼遲到呢? 授權,封裝和一切都是一種對象,也以某種方式從消息傳遞中派生出來。 – 2009-04-02 23:27:26

0

支持類,方法,屬性,封裝,數據隱藏,繼承,多態性,抽象...?

7

根據Booch的,以下元素: 專業:

  • 抽象
  • 封裝
  • 模塊化
  • 層次(繼承)

次要:

  • 打字
  • 併發
  • 持久
3

Smalltalk中通常被認爲是典型的面向對象的語言,雖然西穆拉經常被當作第一面向對象語言。

  • 的Smalltalk類:紅寶石,Objective-C的
  • 西穆拉樣:

    當前OO語言都可以通過他們借用了大多數概念的語言鬆散地分爲C++,Object Pascal中,爪哇, C#

+0

不要忘記目標C和Javascript從Smalltalk的分支來 – Mamut 2009-08-13 19:26:58

-2

原型

表達真實場景中代碼的能力。

foreach(House house in location.Houses) 
{ 
foreach(Deliverable mail in new Mailbag(new Deliverable[] 
       { 
       GetLetters(), 
       GetPackages(), 
       GetAdvertisingJunk() 
       }) 
{ 
    if(mail.AddressedTo(house)) 
    { 
     house.Deliver(mail); 
    } 
} 
} 

-

foreach(Deliverable myMail in GetMail()) 
{ 
    IReadable readable = myMail as IReadable; 
    if (readable != null) 
    { 
     Console.WriteLine(readable.Text); 
    } 
} 

爲什麼?

幫助我們更容易地理解這一點。在我們的頭腦中它更合理,如果正確實施,代碼更高效,可重複使用並減少重複。

要做到這一點,你需要:

  • 指針/引用確保本==這一點,這是=!
  • 指向(例如,手臂)存儲數據(int毛髮)和操作(拋出(IThrowable))
  • 多態性(繼承和/或接口)以通用方式處理特定對象,以便您可以閱讀書籍以及牆上的塗鴉(都實現IReadable)
  • 封裝,因爲蘋果不公開的原子[]屬性
1

據我所知,使語言爲「面向對象」的主要觀點是支持分組數據的思想,以及對這些數據起作用的方法,通常通過類,模塊,繼承,多態性等

請參閱this discussion瞭解人們思考(思考?)的概述面向對象的方法。正如Kristopher指出的那樣,「原型」OO語言 - 的確是Smalltalk。

4

這不是OO的語言,而是代碼。

可以編寫面向對象的C代碼(如果你願意,可以使用結構體和函數指針成員),我已經看到了一些很好的例子。 (想到Quake 2/3 SDK)。用C++編寫程序(即非OO)代碼也是絕對有可能的。

鑑於這一點,我認爲這是語言支持編寫優秀的OO代碼,使其成爲「面向對象的語言」。例如,我將永遠不會在C的結構中使用函數指針成員,例如,普通成員函數;因此我會說C不是OO語言。

(擴大這一點,可以說,Python是不是面向對象的,或者說,對每一步強制性的「自我」的參考和構造稱爲初始化,諸如此類的東西。但是這是一個宗教討論)

+0

只是爲了誘餌一秒,爲什麼地球上不會有一個隱含的自我關鍵字意味着蟒蛇不是面向對象? – interstar 2008-10-19 16:13:57

+2

對不起,什麼? – aib 2008-10-20 17:22:07

0

忽視的理論意義,這似乎是

:-P「有一個叫‘階級’關鍵字的所有語言」

+3

有趣...但錯誤 – interstar 2008-10-19 16:14:29

0

爲了進一步什麼AIB說,我會說一門語言是不是真的對象除非有可用的標準庫 面向對象。這個最大的例子是PHP。儘管它支持所有面向對象的標準概念,但如此大比例的標準庫並不面向對象,這意味着以面向對象的方式編寫代碼幾乎是不可能的。

如果所有標準庫仍然要求您在所有函數調用中加入像mysql_和pgsql_之類的東西,並且使用支持實際API中的名稱空間的語言,那麼它們將引入名稱空間並不重要用mysql_去除函數,並在文件的頂部添加一個簡單的「include system.db.mysql。*」,這樣它就能知道這些東西來自哪裏。

7

基本上面向對象確實可歸結爲

在程序語言「傳遞信息」,我把這樣的功能:

f(x) 

和名字f的可能綁定到特定塊代碼在編譯時。 (除非這是一個具有更高階函數或指向函數的過程語言,但是讓我們暫時忽略這種可能性)。因此,這行代碼只能意味着一個毫不含糊的東西。

在面向對象的語言我傳遞消息到一個對象,或許是這樣的:

o.m(x) 

在這種情況下。 m不是代碼塊的名稱,而是「方法選擇器」,調用哪個代碼塊實際上取決於對象o。這行代碼更加模糊或泛泛,因爲它可能意味着在不同情況下的不同事情,具體取決於o。

在大多數OO語言中,對象o有一個「類」,類決定調用哪個代碼塊。在幾種OO語言中(最着名的是Javascript)o沒有類,但有方法在運行時直接附加到它,或者從原型繼承它們。

我的分界是,語言不是OO就不需要類和繼承。但是這種消息的多態處理是至關重要的。

雖然你可以用C語言中的函數指針來僞造這個,但這不足以讓C被稱爲OO語言,因爲你將不得不實現自己的基礎結構。你可以做到這一點,並可以使用面向對象的風格,但是語言並沒有給你。

0

時,你可以做類,它是
例如面向對象:Java是面向對象,JavaScript是不是和C++,看起來像某種「目標好奇」語言

+0

JavaScript通常被認爲是OO:它*確實*有對象,而不是類。 (具體來說,它是基於原型的OO,而不是基於類的OO)。如果你願意,你可以在原型系統的頂部實際實現一個類系統,並且ES6和CoffeeScript都可以通過語法糖來完成。反過來也是如此,BTW:一些面向類的OO語言(如Ruby,但可能不是Java)可以在沒有太多麻煩的情況下完成原型OO。 – 2017-09-19 00:50:40

0

以我的經驗,語言不是面向對象的,代碼是。

幾年前,我正在編寫一套AppleScript程序,當我開始注意OO時,它並未真正實施任何面向對象的功能。在AppleScript中編寫對象是很笨拙的,但如果你花時間弄清楚如何創建類,構造函數等等,也是可能的。

該語言是該領域的正確語言:在Macintosh上獲取不同的程序,共同完成基於輸入文件的一些自動任務。自行實施面向對象的風格是正確的編程選擇,因爲它導致代碼更容易出錯 - 拍攝,測試和理解。

我發現在將代碼從程序變爲OO時最注意的特性是封裝:屬性和方法調用。

0

Simples:(比較保險字符)

1-多態性 2-繼承 3-封裝 4-再利用。 :)

0

對象:一個對象是數據的存儲庫。例如,如果MyList是ShoppingList對象,MyList可能會記錄您的購物清單。

類:類是一種對象類型。許多同一類的對象可能存在;例如,MyList和YourList都可以是ShoppingList對象。

方法:對對象或類進行操作的過程或函數。一種方法與特定的類相關聯。例如,addItem可能是一個將項目添加到任何ShoppingList對象的方法。有時候一種方法與一個類的族相關聯。例如,addItem可能在任何List上操作,其中ShoppingList只是一種類型。

繼承:一個類可以從更普通的類繼承屬性。例如,ShoppingList類從List類繼承了存儲項目序列的屬性。

多態性:能夠讓一個方法調用在幾個不同的對象類上工作,即使這些類需要不同的方法調用實現。例如,一行代碼可能能夠在每種列表上調用「addItem」方法,即使將商品添加到ShoppingList與將商品添加到ShoppingCart完全不同。

面向對象:每個對象都知道它自己的類以及哪些方法處理該類中的對象。每個ShoppingList和每個ShoppingCart都知道addItem的哪個實現適用於它。

在這個列表中,真正區分面嚮對象語言和過程語言(C,Fortran,Basic,Pascal)的一件事是多態。

來源:https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

相關問題