[請益] 多型用在哪

看板 Soft_job
作者
時間
留言 105則留言,33人參與討論
推噓 25 ( 25推 0噓 80→ )
討論串 5
如題 看了stackoverflow的一個例子 class Cup { int capacity } class TeaCup : Cup { string flavour } class CoffeeCup : Cup { string brand } Cup c = new CoffeeCup(); public int measure(Cup c) { return c.capacity } 他的解釋是 you can pass just a Cup instead of a specific instance. This aids in generality because you don't have to provide a specific measure() instance per each cup type 問題是我不是只要 在Cup 類別中定義 measure這個方法 不就可以了嗎 為何不要在宣告物件的時候都 使用 CoffeeCup c= new CoffeeCup(); 請問多型的用途是? --
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.226.11.41 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1614828057.A.414.html
1Ftnfshjcc: 給個箭頭等Job警察03/04 11:22
2Ftnfshjcc: 洗杯子機器如果可以接受Cup而非每種Cup 就省很多功夫03/04 11:25
3Fbbser: 不是每個class都需要measure這個方法03/04 11:27
4Fhanshsu: Google一下啊 QQ 03/04 11:27
5Falihue: dependency injection 03/04 11:37
6Fumum29: 岔題一下 用動物或物體當例子實在讓初學者摸不著頭緒03/04 11:41
7Fumum29: 為什麼不拿實際有用的例子 像logger可以存檔案也可存DB03/04 11:42
8FYahooTaiwan: 本版接納多元問題討論,反正文章已經夠少了,不用管03/04 11:43
9Fmeowyih: 哈哈真的,教科書老是用甚麼動物還顏色的,明明真實例子03/04 11:43
10Fmeowyih: 的很多就是不用03/04 11:43
11Fumum29: 或是DataBaseConnection可以多型成SQL MySQL ProsGre....03/04 11:44
12Fumum29: 去stackoverflow查 一堆鄉民用的例子都比這些還經典03/04 11:45
13Fhanshsu: 初學者可能連db都不知道啊...03/04 11:45
14Fmeowyih: 像寫2d遊戲會用各種不同的geometry,然後統一用同一個母03/04 11:45
15Fmeowyih: 類型畫上螢幕不好嗎?大家都愛寫遊戲呀~03/04 11:45
16Fgn1943141: 你家國際牌插座如果只能用國際牌電器,就是GG思密達,03/04 11:50
17Fgn1943141: 抽象化/標準化,搭配多型才能讓系統彈性適應變化03/04 11:50
18Fjknm0510a: 插頭通常用adapter處理(開新戰場)03/04 11:53
19Fgn1943141: Adapter比較像處理不同插座(歐規、中國、台灣)的問題03/04 11:59
20Fvi000246: 買本設計模式看一下吧03/04 12:00
21Fgn1943141: 講極端一點,想像如果每個電器的插頭都是不一樣的...03/04 12:03
22FOriginStar: 想成 human.washCup(Cup c) 是不是比較好懂阿 03/04 12:08
23FOriginStar: 不用為每種杯子都宣告一個method,也少了型態轉換的03/04 12:10
24FOriginStar: code,程式碼會更簡潔好維護03/04 12:10
O大的意思是,萬一沒有宣告method在 Cup 中,也可以做的意思? 但我的想法是直接把measure放在 Cup中 那麼所有子類別的Cup都可以用 ※ 編輯: empireisme (101.12.69.35 臺灣), 03/04/2021 12:14:36
25Falihue: 樓上 這樣會變成人在洗 c 罩杯 03/04 12:13
26Ftheedge: 發文請 implement Job介面 03/04 12:21
27FOriginStar: 主要是程式碼越變越胖時,要考量維護和擴充性 03/04 12:22
28FOriginStar: 例如之後有個robot.washCup(Cup c)出現,也比較好維護 03/04 12:23
29FOriginStar: 當然要作在Cup Class 本身也不是不行,有時要考量類別 03/04 12:24
30Fsoheadsome: 現在都馬pattern matching誰跟你多型 03/04 12:24
31FOriginStar: 的互動,有點難解釋就是了 03/04 12:25
32Ftaipoo: 推25樓QQ 03/04 12:30
33Fjej: 多型 你的例子確實用處不多 03/04 12:38
34Fjej: 但實作用在資料庫 可確保存取正確資料表 或欄位 03/04 12:38
35Fjej: 在邏輯上 更是很多OO的基石 例如前幾篇策略模式 取代if else 03/04 12:38
36Fjej: 或是複雜邏輯運算decorate 03/04 12:38
37Fjej: 或是偵測變化observer 03/04 12:38
38Fjej: 就是你看到設計模式中的那幾個常用模式 好處太多 缺點也有 03/04 12:38
39Fjej: 缺點是能力不到位 維運複雜 03/04 12:38
40Fjej: 或是撰寫者設計模式中毒 維運時名稱和物件運作不相關 混亂 03/04 12:38
41Fjej: 總之就是觀察你們老闆 03/04 12:52
42Fjej: 如果他是屬於找剛畢業 或是巨匠專業 免洗工程師的 03/04 12:52
43Fjej: 勸你還是不要用OO甚至到OO的多型 03/04 12:52
44Fjej: 如果老闆的老闆有鴻圖大業的抱負,老闆傾向找資深工程師 03/04 12:52
45Fjej: OO就很有用了,在很多開放原始碼的套件都用的很兇 03/04 12:52
46Fjej: 甚至套件EOS之後你還能透過原始碼了解功能 03/04 12:52
47Fshooter555: 杯子自己又不會算 怎麼能把他放在杯子裡 除非你的杯子 03/04 12:53
48Fshooter555: 內建計算機功能 03/04 12:53
49Fshooter555: 物件都不物件了怎麼還能算物件導向 03/04 12:57
50Ftttkkk: 你的問題癥結點是不是在 new 那個陳述?你是不是在想如果 03/04 13:02
51Ftttkkk: 為了改變 c 是屬於那種杯子,還要去改 code,那好像省不 03/04 13:02
52Ftttkkk: 了太多時間?你還要找到整個專案其中相關的程式碼全部把 03/04 13:02
53Ftttkkk: Coffee Cup() 改為 TeaCup(),這樣似乎沒有比寫成 Coff 03/04 13:02
54Ftttkkk: eeCup c = new CoffeeCup() 省掉太多時間,也沒有真的很 03/04 13:02
55Ftttkkk: 好維護對嗎?我相信每個剛接觸多型且心思比較細膩的人都 03/04 13:02
56Ftttkkk: 會有跟你一樣的疑問。會有這種疑問是因為這些範例都只講 03/04 13:02
57Ftttkkk: 了一半,進階的後半段是如何利用多型的概念往上疊加其他 03/04 13:02
58Ftttkkk: 作法使其變成好維護的專案。你可以查一下上面有人提到的 03/04 13:02
59Ftttkkk: dependency injection,或是再加上 Spring 關鍵字可能會 03/04 13:02
60Ftttkkk: 有更清楚的範例。 03/04 13:02
61Fshadow10230: 你講的寫法也可以沒錯,兩個各有優缺。measure 定義 03/04 13:22
62Fshadow10230: 在 cup 的好處是,新增 cup 的的時候,其他 measur 03/04 13:22
63Fshadow10230: e 不會被修改到,壞處是,新增 method,比方說 cle 03/04 13:22
64Fshadow10230: anup() 的時候,所有 cups 都需要被修改。相反地, 03/04 13:22
65Fshadow10230: 把 measure 定義在外的話,新增 cup,measure 就需 03/04 13:22
66Fshadow10230: 要修改,但新增 wash 的時候,所有 cup 都不用被修 03/04 13:22
67Fshadow10230: 改。 03/04 13:22
68Fshadow10230: 你可以根據你開發的功能重視新增 class 還是新增 m 03/04 13:31
69Fshadow10230: ethod,決定適合哪一種寫法 03/04 13:31
70Fucrxzero: 請問樓上 工廠模式不就是這樣嗎? 03/04 14:43
71Fucrxzero: 我可不可以說多型的應用層面就是工廠模式 03/04 14:44
72Fucrxzero: 先不說動態binding那些東東 03/04 14:44
73Fucrxzero: 光以code的可擴展性與複用性 03/04 14:44
74Fucrxzero: 開放封閉原則 03/04 14:47
75Fempireisme: 對謝謝tt大 03/04 15:39
76Fqrtt1: https://bit.ly/3q9bd1m 參考一下 Java 版的討論吧 03/04 17:41
77Fpichubaby: toString() 通常都是多型的最佳案例 03/04 17:56
78FHsins: haha 哥怎麼沒出現 03/04 18:39
79Fjackflu: YT搜: 4.7: Introduction to Polymorphism 03/04 19:38
80Fjackflu: 影片長 8:46 頻道:The Coding Train 03/04 19:39
81Fwulouise: measure的主詞不是cup, 可能是人或機器,至於用base typ 03/04 21:11
82Fwulouise: e的原因,是邏輯共用,只有實作有差 03/04 21:11
83Fjackflu: 網址支援: https://youtu.be/qqYOYIVrso0 03/04 23:18
84Fempireisme: 謝謝 03/05 00:07
85Fvirnux: 你講的沒有錯 是這個例子太單純 你提出的方法跟他的方法差 03/05 01:08
86Fvirnux: 異不大 但是如果measure方法換成比較複雜的計算它就不適合 03/05 01:09
87Fvirnux: 放在cup類別裡 03/05 01:10
88Finternetms52: 把measure放在cup中沒有不可以,前提是大家的meas 03/05 08:06
89Finternetms52: ure方法都一樣,如果有人不一樣,就要override方法 03/05 08:06
90Finternetms52: ,如果有人不只不一樣,還剛好有一群是用那個不一 03/05 08:06
91Finternetms52: 樣的方法,你就會寫一樣的東西寫到懷疑人生,最後 03/05 08:06
92Finternetms52: 把他拉成一個interface,叫measurable 03/05 08:06
93Faidansky0989: 因為你不會希望不同物件耦合在一起 03/05 09:27
94Fshooter555: 我覺得多型這個翻譯很容易讓人無法理解 為什麼不翻多 03/05 13:16
95Fshooter555: 態呢 明明是仿造自然界的變態行為 03/05 13:17
96Fshooter555: 父類別 蛙 行為 移動 子類別蝌蚪 幼蛙 成蛙 03/05 13:20
97Fshooter555: 蝌蚪.移動() 幼蛙.移動() 成蛙.移動() 行為界面一樣 03/05 13:22
98Fshooter555: 但內容動作不同不就是多型(態)了 03/05 13:23
99Fyoutuuube000: 蠻意外這個主題會這麼多人回... 03/05 16:12
100Fterrybob: 感謝各方高手的說法,受教了… 03/05 16:34
101FGoodFriday: 好多佛心大大~ 03/06 00:49
102Flonglongint: 因為給初學者的範例不能太難,所以會有這種疑惑 03/06 17:39
103Fsuperpandal: 培訓機構? 反覆推敲是基本 03/09 06:03
104Fsuperpandal: 真的無自學力可以考慮適不適合 03/09 06:07
105Fsuperpandal: 連推說多人... 03/09 06:37

完整討論串

留言數 標題 作者 日期
105 >> [請益] 多型用在哪 empireisme 2021/03/04 11:20:54
3 Re: [請益] 多型用在哪 cateran 2021/03/04 12:13:13
0 Re: [請益] 多型用在哪 ucrxzero 2021/03/04 14:23:07
23 Re: [請益] 多型用在哪 elements 2021/03/04 16:30:25
13 Re: [請益] 多型用在哪 EricTCartman 2021/03/05 00:20:10

Soft_Job 看板熱門文章

24
66
18
51
32
125
19
35
9
27