Re: [問題] 請推薦有稍微真實範例的物件導向書

看板C_and_CPP作者 ( )時間9年前 (2015/03/06 18:34), 9年前編輯推噓3(3014)
留言17則, 6人參與, 最新討論串3/3 (看更多)
※ 引述《purpose (purpose)》之銘言: : ※ 引述《mself (mself)》之銘言: : : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : : Linux/Windows : : 問題(Question): : : 印象中,一些書說明物件導向的範例較不真實 : : 極端一點,好像有看到舉例 : : 鴨子呱呱叫、鴿子咕咕叫, : : 鴨子和鴿子都是禽類,禽類會叫 : : 禽類(鴨子).叫()是呱呱而不是咕咕 : : ... : 容小弟無知,岔一下題,因為說到動物的例子,突然很想貼一段話上來... 說到動物, 不禁想到以前看過一個很有趣的自嘲, 看一次笑一次 讓大家看看有沒有共鳴XD https://twitter.com/tomaspetricek/status/402827811297050624 Tomas Petricek @tomaspetricek How #OOP models the real world? Dog, Mammal, Animal, NonNullAnimal, UpdatableNonEmptyMammal, NonNullMammalFactory... 也有其他回覆 (應該是在 google+ 看到的, 忘了連結...) Jingqi Xie2014年1月2日 回覆 Canis_lupus Canis Canidae Carnivora Mammalia Vertebrata Animalia Above is the correct inheritance chain. 不過個人覺得 OOP 真的不好學, 需要很多實務經驗. 只是有時候還是會 想到一些無關緊要的小問題, 例如 java 的 .equals (好像)是一律傳 Object 進去, 一些 dynamic language 的 '==' 也會正確的被 override, 那不知道 C++ 有沒有 idiomatic 的寫法? 舉例來說, 假使有 class A { public: bool operator==(const A&) const; }; class B : public A { public: bool operator==(const B&) const; }; 那當我有兩個 B 的 instance 用 A* 指的時候, 被呼叫到的 operator== 實在很難說是不是 "正確" (心裡想要)的.... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.21.56 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1425638054.A.0BA.html

03/06 20:04, , 1F
那個 == 就是萬惡的 multimethod 啊 XD
03/06 20:04, 1F

03/06 20:04, , 2F
idiomatic 的寫法就是 double dispatch
03/06 20:04, 2F

03/06 20:09, , 3F
但實際上這是語言的限制,有些語言就支援multimethod
03/06 20:09, 3F

03/06 20:21, , 4F
我也覺得與其說是 OOP 的問題,不如說是語言的問題XD
03/06 20:21, 4F

03/06 20:22, , 5F
只要扯到雙方形態的問題,首先就想到 double dispatch
03/06 20:22, 5F

03/06 20:26, , 6F
糟糕 感覺好像馬後炮,跟着一樓重複了一遍XD
03/06 20:26, 6F

03/06 21:43, , 7F
XDDDDDD
03/06 21:43, 7F

03/06 21:44, , 8F
類似的東西 subtype 到底該怎麼做...
03/06 21:44, 8F

03/06 22:17, , 9F
感謝提供關鍵字! 來學 Common Lisp
03/06 22:17, 9F

03/06 23:24, , 10F
樓上不是會嗎?
03/06 23:24, 10F
我只有學過 Scheme 5...

03/06 23:42, , 11F
== 的狀況,還是有可能 B 跟 A*互動的,所以我覺得還是他
03/06 23:42, 11F

03/06 23:43, , 12F
老人家原本拿來嘴泡的例子,比較適合出來拿出來罵繼承
03/06 23:43, 12F

03/06 23:44, , 13F
就是動物類別決定,兩個動物交配產生動物,可是繼承之後
03/06 23:44, 13F

03/06 23:45, , 14F
就會亂多出一個根本不該存在的,長頸鹿跟動物交配的函數
03/06 23:45, 14F
對, 有可能 B 跟 A* 有互動, 但是常見的動態語言跟靜態型別語言在這邊的處理 真的滿不一樣的. 像 Ruby 直接寫就會覆寫掉, 在 C++ 跟 Java 會變 overloading ( 而且 C++ 還會把名稱蓋掉, 要用 ptrB->A::operator==(....) ) 這邊是之前在想 operator== 能不能比較可延伸的做的時候聯想到的, 一方面也是讀了一篇論述說用繼承 induced 的 subtyping relation 在某些 case 表現不好

03/07 14:10, , 15F
這篇其實還滿心有戚戚焉的 XD 有時候拿到東西還得
03/07 14:10, 15F

03/07 14:10, , 16F
用debugger確定是不是跑到我預想的class function
03/07 14:10, 16F

03/07 14:11, , 17F
早一點的debugger還沒辦法對應template 碰到就很慘
03/07 14:11, 17F
得這樣做也太難過了QQ... ※ 編輯: suhorng (36.225.42.83), 03/08/2015 23:40:58 ※ 編輯: suhorng (36.225.42.83), 03/08/2015 23:41:13 ※ 編輯: suhorng (36.225.42.83), 03/08/2015 23:47:01
文章代碼(AID): #1K-OAc2w (C_and_CPP)
文章代碼(AID): #1K-OAc2w (C_and_CPP)