[請益] 多型用在哪

看板Soft_Job作者 (empireisme)時間3年前 (2021/03/04 11:20), 3年前編輯推噓25(25077)
留言102則, 32人參與, 3年前最新討論串1/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

03/04 11:22, 3年前 , 1F
給個箭頭等Job警察
03/04 11:22, 1F

03/04 11:25, 3年前 , 2F
洗杯子機器如果可以接受Cup而非每種Cup 就省很多功夫
03/04 11:25, 2F

03/04 11:27, 3年前 , 3F
不是每個class都需要measure這個方法
03/04 11:27, 3F

03/04 11:27, 3年前 , 4F
Google一下啊 QQ
03/04 11:27, 4F

03/04 11:37, 3年前 , 5F
dependency injection
03/04 11:37, 5F

03/04 11:41, 3年前 , 6F
岔題一下 用動物或物體當例子實在讓初學者摸不著頭緒
03/04 11:41, 6F

03/04 11:42, 3年前 , 7F
為什麼不拿實際有用的例子 像logger可以存檔案也可存DB
03/04 11:42, 7F

03/04 11:43, 3年前 , 8F
本版接納多元問題討論,反正文章已經夠少了,不用管
03/04 11:43, 8F

03/04 11:43, 3年前 , 9F
哈哈真的,教科書老是用甚麼動物還顏色的,明明真實例子
03/04 11:43, 9F

03/04 11:43, 3年前 , 10F
的很多就是不用
03/04 11:43, 10F

03/04 11:44, 3年前 , 11F
或是DataBaseConnection可以多型成SQL MySQL ProsGre....
03/04 11:44, 11F

03/04 11:45, 3年前 , 12F
去stackoverflow查 一堆鄉民用的例子都比這些還經典
03/04 11:45, 12F

03/04 11:45, 3年前 , 13F
初學者可能連db都不知道啊...
03/04 11:45, 13F

03/04 11:45, 3年前 , 14F
像寫2d遊戲會用各種不同的geometry,然後統一用同一個母
03/04 11:45, 14F

03/04 11:45, 3年前 , 15F
類型畫上螢幕不好嗎?大家都愛寫遊戲呀~
03/04 11:45, 15F

03/04 11:50, 3年前 , 16F
你家國際牌插座如果只能用國際牌電器,就是GG思密達,
03/04 11:50, 16F

03/04 11:50, 3年前 , 17F
抽象化/標準化,搭配多型才能讓系統彈性適應變化
03/04 11:50, 17F

03/04 11:53, 3年前 , 18F
插頭通常用adapter處理(開新戰場)
03/04 11:53, 18F

03/04 11:59, 3年前 , 19F
Adapter比較像處理不同插座(歐規、中國、台灣)的問題
03/04 11:59, 19F

03/04 12:00, 3年前 , 20F
買本設計模式看一下吧
03/04 12:00, 20F

03/04 12:03, 3年前 , 21F
講極端一點,想像如果每個電器的插頭都是不一樣的...
03/04 12:03, 21F

03/04 12:08, 3年前 , 22F
想成 human.washCup(Cup c) 是不是比較好懂阿
03/04 12:08, 22F

03/04 12:10, 3年前 , 23F
不用為每種杯子都宣告一個method,也少了型態轉換的
03/04 12:10, 23F

03/04 12:10, 3年前 , 24F
code,程式碼會更簡潔好維護
03/04 12:10, 24F
O大的意思是,萬一沒有宣告method在 Cup 中,也可以做的意思? 但我的想法是直接把measure放在 Cup中 那麼所有子類別的Cup都可以用 ※ 編輯: empireisme (101.12.69.35 臺灣), 03/04/2021 12:14:36

03/04 12:13, 3年前 , 25F
樓上 這樣會變成人在洗 c 罩杯
03/04 12:13, 25F

03/04 12:21, 3年前 , 26F
發文請 implement Job介面
03/04 12:21, 26F

03/04 12:22, 3年前 , 27F
主要是程式碼越變越胖時,要考量維護和擴充性
03/04 12:22, 27F

03/04 12:23, 3年前 , 28F
例如之後有個robot.washCup(Cup c)出現,也比較好維護
03/04 12:23, 28F

03/04 12:24, 3年前 , 29F
當然要作在Cup Class 本身也不是不行,有時要考量類別
03/04 12:24, 29F

03/04 12:24, 3年前 , 30F
現在都馬pattern matching誰跟你多型
03/04 12:24, 30F

03/04 12:25, 3年前 , 31F
的互動,有點難解釋就是了
03/04 12:25, 31F

03/04 12:30, 3年前 , 32F
推25樓QQ
03/04 12:30, 32F

03/04 12:38, 3年前 , 33F
多型 你的例子確實用處不多
03/04 12:38, 33F

03/04 12:38, 3年前 , 34F
但實作用在資料庫 可確保存取正確資料表 或欄位
03/04 12:38, 34F

03/04 12:38, 3年前 , 35F
在邏輯上 更是很多OO的基石 例如前幾篇策略模式 取代if else
03/04 12:38, 35F

03/04 12:38, 3年前 , 36F
或是複雜邏輯運算decorate
03/04 12:38, 36F

03/04 12:38, 3年前 , 37F
或是偵測變化observer
03/04 12:38, 37F

03/04 12:38, 3年前 , 38F
就是你看到設計模式中的那幾個常用模式 好處太多 缺點也有
03/04 12:38, 38F
還有 24 則推文
03/04 13:22, 3年前 , 63F
e 不會被修改到,壞處是,新增 method,比方說 cle
03/04 13:22, 63F

03/04 13:22, 3年前 , 64F
anup() 的時候,所有 cups 都需要被修改。相反地,
03/04 13:22, 64F

03/04 13:22, 3年前 , 65F
把 measure 定義在外的話,新增 cup,measure 就需
03/04 13:22, 65F

03/04 13:22, 3年前 , 66F
要修改,但新增 wash 的時候,所有 cup 都不用被修
03/04 13:22, 66F

03/04 13:22, 3年前 , 67F
改。
03/04 13:22, 67F

03/04 13:31, 3年前 , 68F
你可以根據你開發的功能重視新增 class 還是新增 m
03/04 13:31, 68F

03/04 13:31, 3年前 , 69F
ethod,決定適合哪一種寫法
03/04 13:31, 69F

03/04 14:43, 3年前 , 70F
請問樓上 工廠模式不就是這樣嗎?
03/04 14:43, 70F

03/04 14:44, 3年前 , 71F
我可不可以說多型的應用層面就是工廠模式
03/04 14:44, 71F

03/04 14:44, 3年前 , 72F
先不說動態binding那些東東
03/04 14:44, 72F

03/04 14:44, 3年前 , 73F
光以code的可擴展性與複用性
03/04 14:44, 73F

03/04 14:47, 3年前 , 74F
開放封閉原則
03/04 14:47, 74F

03/04 15:39, 3年前 , 75F
對謝謝tt大
03/04 15:39, 75F

03/04 17:41, 3年前 , 76F
https://bit.ly/3q9bd1m 參考一下 Java 版的討論吧
03/04 17:41, 76F

03/04 17:56, 3年前 , 77F
toString() 通常都是多型的最佳案例
03/04 17:56, 77F

03/04 18:39, 3年前 , 78F
haha 哥怎麼沒出現
03/04 18:39, 78F

03/04 19:38, 3年前 , 79F
YT搜: 4.7: Introduction to Polymorphism
03/04 19:38, 79F

03/04 19:39, 3年前 , 80F
影片長 8:46 頻道:The Coding Train
03/04 19:39, 80F

03/04 21:11, 3年前 , 81F
measure的主詞不是cup, 可能是人或機器,至於用base typ
03/04 21:11, 81F

03/04 21:11, 3年前 , 82F
e的原因,是邏輯共用,只有實作有差
03/04 21:11, 82F

03/04 23:18, 3年前 , 83F
03/04 23:18, 83F

03/05 00:07, 3年前 , 84F
謝謝
03/05 00:07, 84F

03/05 01:08, 3年前 , 85F
你講的沒有錯 是這個例子太單純 你提出的方法跟他的方法差
03/05 01:08, 85F

03/05 01:09, 3年前 , 86F
異不大 但是如果measure方法換成比較複雜的計算它就不適合
03/05 01:09, 86F

03/05 01:10, 3年前 , 87F
放在cup類別裡
03/05 01:10, 87F

03/05 08:06, 3年前 , 88F
把measure放在cup中沒有不可以,前提是大家的meas
03/05 08:06, 88F

03/05 08:06, 3年前 , 89F
ure方法都一樣,如果有人不一樣,就要override方法
03/05 08:06, 89F

03/05 08:06, 3年前 , 90F
,如果有人不只不一樣,還剛好有一群是用那個不一
03/05 08:06, 90F

03/05 08:06, 3年前 , 91F
樣的方法,你就會寫一樣的東西寫到懷疑人生,最後
03/05 08:06, 91F

03/05 08:06, 3年前 , 92F
把他拉成一個interface,叫measurable
03/05 08:06, 92F

03/05 09:27, 3年前 , 93F
因為你不會希望不同物件耦合在一起
03/05 09:27, 93F

03/05 13:16, 3年前 , 94F
我覺得多型這個翻譯很容易讓人無法理解 為什麼不翻多
03/05 13:16, 94F

03/05 13:17, 3年前 , 95F
態呢 明明是仿造自然界的變態行為
03/05 13:17, 95F

03/05 13:20, 3年前 , 96F
父類別 蛙 行為 移動 子類別蝌蚪 幼蛙 成蛙
03/05 13:20, 96F

03/05 13:22, 3年前 , 97F
蝌蚪.移動() 幼蛙.移動() 成蛙.移動() 行為界面一樣
03/05 13:22, 97F

03/05 13:23, 3年前 , 98F
但內容動作不同不就是多型(態)了
03/05 13:23, 98F

03/05 16:12, 3年前 , 99F
蠻意外這個主題會這麼多人回...
03/05 16:12, 99F

03/05 16:34, 3年前 , 100F
感謝各方高手的說法,受教了…
03/05 16:34, 100F

03/06 00:49, 3年前 , 101F
好多佛心大大~
03/06 00:49, 101F

03/06 17:39, 3年前 , 102F
因為給初學者的範例不能太難,所以會有這種疑惑
03/06 17:39, 102F
文章代碼(AID): #1WG58PGK (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1WG58PGK (Soft_Job)