2014-11-24 85 views
1

這是我的理解,面向對象編程提倡對象互相交互。但就我所見(我學到一點Java)而言,這些程序具有明確的做事方式。像main例程或某些其他功能強制對象使用其方法。Java是否真的面向對象?

我也讀過OOP程序應該類似於現實世界。在現實世界的例子中,貓和狗會在沒有外界干預的情況下互動。沒有人會強迫狗狗吠貓,但它是在「狗」對象的性質。

但是在Java中,對象並不真正彼此交互。有一個功能指導對象的交互。如果所有的物體都可以識別近物體(沒有其他功能的幫助)並且同時運行它們的行爲,它會不會更好?我認爲它會更適合現實世界。

編輯: - @Makoto是的,我的觀點是,對象不會自動相互作用。

如果對象可以識別同一附近的其他對象並同時運行(如線程),我們可以更加貼近真實世界,同時編寫它來完成我們的工作。

例如: -

class Dog { 

    if you see a cat object in the same place 

     bark at it. 

    if you see the owner object 

     wag your tail. 
} 

如果是這樣,我們可以創建一個組對象,讓他們自動交互,該方案將不會是線性的。是的,它與正常的OOP或函數式編程不同。 但我們可以達到相同的結果,所以我希望在現實世界中。

+0

您正在描述模擬器和數據點。你當然可以用Java創建其中的一個,但除非明確告訴兩個對象互相交互,否則它們不會。有點像現實世界。 – Makoto 2014-11-24 05:21:48

+0

你很多人都這樣做,就像做一個聽衆,當狗看到一隻貓時觸發狗的吠叫。 – Junaid 2014-11-24 05:24:41

+0

你可能想看看發佈 - 訂閱模式。它會允許你描述的這種行爲。當然,你必須告訴每個對象它是什麼以及它必須做什麼。除此之外,你無法將對象稱爲「貓」,它會以某種方式知道它不得不喵喵叫。主要功能只是一個相當原始的做法。 – ValtsBlukis 2014-11-24 06:01:43

回答

2

有趣的哲學問題。只是我的愚見:

  1. 你不一定被迫創建一個世界的準確副本。你只需要一個足夠適合你的企業的模型(我甚至不會考慮「什麼是一個準確的世界副本」,有些人可能會感受到狗被更高的權力所控制......)關於'獨立性':在一些真實世界的場景中,對象作出獨立的決定(例如,你的貓狗&狗的例子);在其他情況下,對象受到控制(例如,如果貓是木偶狗)。 關於彼此的知識 - 如果java讓他們都默認了對方,那也不能反映現實世界:如果有一隻貓與它們之間有一座小山,怎麼辦?他們相互定位的能力取決於風向(風味)等。 所以編程語言必須選擇一些簡單的默認值,知道他們選擇的任何默認值 - 他們不能假定反映所有真實世界的情況。額外的編碼是必需的。

+0

好的補充,感謝Pelit! +1! – drewmoore 2014-11-30 10:30:39

4
class Dog { 
    void barkAtCat(Cat c){ 
     c.gotBarkedAt(this); 
    } 
    void gotHissedAt(Cat c){ 
     barkAtCat(c); 
    } 
} 

class Cat { 
    void gotBarkedAt(Dog d){ 
     hissAtDog(d); 
    } 
    void hissAtDog(Dog d){ 
     d.gotHissedAt(this); 
    } 
} 

下面是兩個Object一個很簡單的例子的「彼此互動」:是的,你必須從「外部」發起的互動 - 因爲,畢竟,這是不是「真正的世界「,它是一個模擬它 - 見@ The111,@Sujan和@ PelitMamani的答案有關的寶貴想法。

儘管如此,這裏的問題的OO原則是,你可以在你的域(狗和貓)在Object在你的程序(DogCat)模型中的對象的性質和行爲,這可以包括這些對象之間的「自動」出現的交互作爲你所編寫對象的性質的函數。在這裏的示例中,對barkAtDog()hissAtCat()的單個調用將導致這兩個對象之間的無限循環交互。這顯然是一個微不足道的例子,但是如果你想象建模對象之間更復雜的行爲和關係,你可以開始想象更復雜,更緊急的自然現象的模擬,我希望在這個答案中傳達的是OO的有用性這樣做。

爲了迴應您的編輯 - 您的直覺認爲多線程對於任何此類模擬都是必不可少的,這是正確的。實際上,在Java類的許多介紹中,多線程單元末尾的項目與您描述的非常類似。

+0

如果downvoter會照顧解釋,我會很樂意聽 – drewmoore 2014-11-24 05:36:51

+4

嘶嘶聲溢出!不,我不是一個downvoter,只是做一個愚蠢的笑話。 :-) – The111 2014-11-24 05:42:36

+0

當時,你沒有提供實際的答案。你只是展示了一大堆代碼。不過,我不確定它是否回答了問題的核心。 – Makoto 2014-11-24 06:01:24

1

任何類型的編程被隱式將包括程序遵循和程序員誰寫的這個程序。今天的編程並不涉及創造彼此玩耍的動物,除非程序員當然確定遊戲類型和每個遊戲所需的條件,並將其包含在他的書面程序中。很可能他會使用OOP編寫該程序。

你的問題不是關於OOP或Java,而是一般的編程。

1

你的問題是不是Ø bject Ø rientated P AGC軟件,但編程和一般的算法。一個程序只做它被指示的事情,否則它不是一個程序。 我們可以想象,貓和狗之間的真實世界可以像其他任何東西一樣進行編程。編程是關於將真實世界的算法和屬性轉換成代碼行。

但是,我們現在可以同意,只有通過編寫代碼行才能創建真實和物理世界。也許在未來,隨着全息和量子計算的突破,我們將能夠用一些代碼行來創建真正的貓和狗..

1

那麼我想擴展drewmoore的答案多一點。

擴展: 有ONE點需要被清除。狗不會吠叫貓自己。狗也知道貓在他面前,媒介是頭腦或大腦。所以我可以將每個人的大腦與各自的actionListener()聯繫起來。在現實世界中大腦觸發狗狂吠,並在計算機/程序世界actionListener()觸發狗狂吠..

+1

main()是,大腦不會在貓和狗之間共享。 – 2014-11-24 14:11:30

+2

**結論:**神存在誰控制着每一件事:) – Junaid 2014-11-24 15:07:18

+2

總結,我的程序,所以我是神? :-) – The111 2014-11-25 02:52:37