為什麼教面向對象編程之前不簡單介紹下邏輯思維里的一些概念?
內涵:區別其他對象的本質屬性,即定義class;外延:符合某類事物特殊屬性的對象,即實例化object。
這樣多容易理解呀,難道沒人感覺翻譯過來的「類」、「對象」、「實例化」,這些中文在日常生活中很少使用嗎?
因為面向對象的類、對象等等,壓根就不能這樣理解。
其中,「類」的意思是說,繼承自同一個父類的所有類,在之後的代碼里,都可以當作父類對待。
這叫做 is-a,核心在於介面一致性。
這個概念,和日常生活中的「分類」有點像,所以才用了一個有濃厚比喻色彩的術語: 「類」(class)
但,一切比喻都是蹩腳的。
比如說,數學上,我們說正方形是特殊的矩形;矩形又是特殊的平行四邊形;但編程時,你不可能讓正方形類繼承於長方形類——因為正方形不存在長和寬,它只有邊長。
換句話說,數學上的分類,壓根沒考慮過碼農編程時糾結的「介面一致性」。
所以,學面向對象的第一步,先跟著我念100遍:
面向對象的「類(class)」只關注介面一致性,和日常語言中的類沒半點關係。
面向對象的「類(class)」只關注介面一致性,和日常語言中的類沒半點關係。
面向對象的「類(class)」只關注介面一致性,和日常語言中的類沒半點關係。
明白了「類」只關注介面一致性,那麼「對象」(object)似乎就很容易理解了:類並不關心狀態,而對象就需要關心狀態;就好象iPhone 5s是一個手機型號,而你的iPhone 5s則是一個型號是iPhone 5s的手機一樣。你的手機和和其它iPhone 5s手機不同的是,它裡面放了你的sim卡、你的通信錄、你的照片,等等。
看,這個比喻多好啊……
但是……
一切比喻都是蹩腳的。
一切比喻都是蹩腳的。
一切比喻都是蹩腳的。
因為很重要所以要說三遍。
比如說,因為編程的需要,很多面向對象語言是有「類成員變數」這麼個概念;這玩意兒能在類中保存狀態,該類實例化得到的對象甚至還能在運行中修改這個狀態……
舉例來說,c++中,就可以在創建/銷毀對象時更新基類中的某個類成員變數,這個變數就可以反映當前從該類實例化的對象中,還有多少存活。
想想看,我要把自己的iPhone 5s手機里的某個信息存到iPhone 5s這個概念里,讓所有用iPhone 5s的人都能看到……說這話的人,真沒吃錯藥?
所以,請確實了解什麼究竟是什麼,千萬不要試圖用比喻來理解問題——入門時,用這種方法來幫助理解,似乎可以降低難度;但隨著學習深入或者實際工作了,往往就回天乏術了。
事實上,正是因為太多太多人——包括某些面向對象領域的領軍人物——陷到「類」這個比喻中出不來,面向對象編程才成為一大公害:
名家吐槽:面向對象編程從骨子裡就有問題
通過實例反推規則 整理出理論 總要有個名詞來代替完整的描述 如果你是理論-實踐 可能就很難懂 但是反過來 因為實踐了 已經有整理規則的衝動 再去看理論 就有一種不謀而合的感覺
推薦閱讀:
※童話該不該考慮現實真理?
※為什麼夢中邏輯思維特別差?
※求推薦入門級的哲學讀物?本人小白,想通過哲學鍛煉自己的邏輯思維。
※有哪些事情是邏輯相似,但卻不能互證?
※「幫富人說話,替窮人辦事」這句話符合邏輯嗎?