[請益] 多型用在哪

作者: empireisme (empireisme)   2021-03-04 11:20:54
如題
看了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();
請問多型的用途是?
作者: tnfshjcc (↖煞气a攜阿攜↘)   2021-03-04 11:22:00
給個箭頭等Job警察洗杯子機器如果可以接受Cup而非每種Cup 就省很多功夫
作者: bbser   2021-03-04 11:27:00
不是每個class都需要measure這個方法
作者: hanshsu (小肉呆)   2021-03-04 11:27:00
Google一下啊 QQ
作者: alihue (wanda wanda)   2021-03-04 11:37:00
dependency injection
作者: umum29 (....)   2021-03-04 11:41:00
岔題一下 用動物或物體當例子實在讓初學者摸不著頭緒為什麼不拿實際有用的例子 像logger可以存檔案也可存DB
作者: YahooTaiwan (超可愛南西我老婆)   2021-03-04 11:43:00
本版接納多元問題討論,反正文章已經夠少了,不用管
作者: meowyih (meowyih)   2021-03-04 11:43:00
哈哈真的,教科書老是用甚麼動物還顏色的,明明真實例子的很多就是不用
作者: umum29 (....)   2021-03-04 11:44:00
或是DataBaseConnection可以多型成SQL MySQL ProsGre....去stackoverflow查 一堆鄉民用的例子都比這些還經典
作者: hanshsu (小肉呆)   2021-03-04 11:45:00
初學者可能連db都不知道啊...
作者: meowyih (meowyih)   2021-03-04 11:45:00
像寫2d遊戲會用各種不同的geometry,然後統一用同一個母類型畫上螢幕不好嗎?大家都愛寫遊戲呀~
作者: gn1943141 (鳩臉)   2021-03-04 11:50:00
你家國際牌插座如果只能用國際牌電器,就是GG思密達,抽象化/標準化,搭配多型才能讓系統彈性適應變化
作者: jknm0510a (Kang)   2021-03-04 11:53:00
插頭通常用adapter處理(開新戰場)
作者: gn1943141 (鳩臉)   2021-03-04 11:59:00
Adapter比較像處理不同插座(歐規、中國、台灣)的問題
作者: vi000246 (Vi)   2021-03-04 12:00:00
買本設計模式看一下吧
作者: gn1943141 (鳩臉)   2021-03-04 12:03:00
講極端一點,想像如果每個電器的插頭都是不一樣的...
作者: OriginStar   2021-03-04 12:08:00
想成 human.washCup(Cup c) 是不是比較好懂阿不用為每種杯子都宣告一個method,也少了型態轉換的code,程式碼會更簡潔好維護
作者: alihue (wanda wanda)   2021-03-04 12:13:00
樓上 這樣會變成人在洗 c 罩杯
作者: theedge   2021-03-04 12:21:00
發文請 implement Job介面
作者: OriginStar   2021-03-04 12:22:00
主要是程式碼越變越胖時,要考量維護和擴充性例如之後有個robot.washCup(Cup c)出現,也比較好維護當然要作在Cup Class 本身也不是不行,有時要考量類別
作者: soheadsome (師大狗鼻哥)   2021-03-04 12:24:00
現在都馬pattern matching誰跟你多型
作者: OriginStar   2021-03-04 12:25:00
的互動,有點難解釋就是了
作者: taipoo (要成功要積極)   2021-03-04 12:30:00
推25樓QQ
作者: jej (晃奶大馬桶)   2021-03-04 12:38:00
多型 你的例子確實用處不多但實作用在資料庫 可確保存取正確資料表 或欄位在邏輯上 更是很多OO的基石 例如前幾篇策略模式 取代if else或是複雜邏輯運算decorate或是偵測變化observer就是你看到設計模式中的那幾個常用模式 好處太多 缺點也有缺點是能力不到位 維運複雜或是撰寫者設計模式中毒 維運時名稱和物件運作不相關 混亂總之就是觀察你們老闆如果他是屬於找剛畢業 或是巨匠專業 免洗工程師的勸你還是不要用OO甚至到OO的多型如果老闆的老闆有鴻圖大業的抱負,老闆傾向找資深工程師OO就很有用了,在很多開放原始碼的套件都用的很兇甚至套件EOS之後你還能透過原始碼了解功能
作者: shooter555 (shooter)   2021-03-04 12:53:00
杯子自己又不會算 怎麼能把他放在杯子裡 除非你的杯子內建計算機功能物件都不物件了怎麼還能算物件導向
作者: tttkkk (學到。)   2021-03-04 13:02:00
你的問題癥結點是不是在 new 那個陳述?你是不是在想如果為了改變 c 是屬於那種杯子,還要去改 code,那好像省不了太多時間?你還要找到整個專案其中相關的程式碼全部把Coffee Cup() 改為 TeaCup(),這樣似乎沒有比寫成 CoffeeCup c = new CoffeeCup() 省掉太多時間,也沒有真的很好維護對嗎?我相信每個剛接觸多型且心思比較細膩的人都會有跟你一樣的疑問。會有這種疑問是因為這些範例都只講了一半,進階的後半段是如何利用多型的概念往上疊加其他作法使其變成好維護的專案。你可以查一下上面有人提到的dependency injection,或是再加上 Spring 關鍵字可能會有更清楚的範例。
作者: shadow10230 (YingHua)   2021-03-04 13:22:00
你講的寫法也可以沒錯,兩個各有優缺。measure 定義在 cup 的好處是,新增 cup 的的時候,其他 measure 不會被修改到,壞處是,新增 method,比方說 cleanup() 的時候,所有 cups 都需要被修改。相反地,把 measure 定義在外的話,新增 cup,measure 就需要修改,但新增 wash 的時候,所有 cup 都不用被修改。你可以根據你開發的功能重視新增 class 還是新增 method,決定適合哪一種寫法
作者: ucrxzero (RX-0)   2021-03-04 14:43:00
請問樓上 工廠模式不就是這樣嗎?我可不可以說多型的應用層面就是工廠模式先不說動態binding那些東東光以code的可擴展性與複用性開放封閉原則
作者: empireisme (empireisme)   2021-03-04 15:39:00
對謝謝tt大
作者: qrtt1 (有些事,有時候。。。)   2021-03-04 17:41:00
https://bit.ly/3q9bd1m 參考一下 Java 版的討論吧
作者: pichubaby (Pichu)   2021-03-04 17:56:00
toString() 通常都是多型的最佳案例
作者: Hsins (翔)   2021-03-04 18:39:00
haha 哥怎麼沒出現
作者: jackflu (jackflu)   2021-03-04 19:38:00
YT搜: 4.7: Introduction to Polymorphism影片長 8:46 頻道:The Coding Train
作者: wulouise (在線上!=在電腦前)   2021-03-04 21:11:00
measure的主詞不是cup, 可能是人或機器,至於用base type的原因,是邏輯共用,只有實作有差
作者: jackflu (jackflu)   2021-03-04 23:18:00
作者: empireisme (empireisme)   2021-03-05 00:07:00
謝謝
作者: virnux (真心離傷心最近)   2021-03-05 01:08:00
你講的沒有錯 是這個例子太單純 你提出的方法跟他的方法差異不大 但是如果measure方法換成比較複雜的計算它就不適合放在cup類別裡
作者: internetms52 (Oaide)   2021-03-05 08:06:00
把measure放在cup中沒有不可以,前提是大家的measure方法都一樣,如果有人不一樣,就要override方法,如果有人不只不一樣,還剛好有一群是用那個不一樣的方法,你就會寫一樣的東西寫到懷疑人生,最後把他拉成一個interface,叫measurable
作者: aidansky0989 (alta)   2021-03-05 09:27:00
因為你不會希望不同物件耦合在一起
作者: shooter555 (shooter)   2021-03-05 13:16:00
我覺得多型這個翻譯很容易讓人無法理解 為什麼不翻多態呢 明明是仿造自然界的變態行為父類別 蛙 行為 移動 子類別蝌蚪 幼蛙 成蛙蝌蚪.移動() 幼蛙.移動() 成蛙.移動() 行為界面一樣但內容動作不同不就是多型(態)了
作者: youtuuube000 (小孩)   2021-03-05 16:12:00
蠻意外這個主題會這麼多人回...
作者: terrybob (罪雲樵)   2021-03-05 16:34:00
感謝各方高手的說法,受教了…
作者: GoodFriday (好星期五)   2021-03-06 00:49:00
好多佛心大大~
作者: longlongint (華哥爾)   2021-03-06 17:39:00
因為給初學者的範例不能太難,所以會有這種疑惑
作者: superpandal   2021-03-09 06:03:00
培訓機構? 反覆推敲是基本真的無自學力可以考慮適不適合連推說多人...

Links booklink

Contact Us: admin [ a t ] ucptt.com