PTT推薦

[請益] 多型用在哪

看板Soft_Job標題[請益] 多型用在哪作者
empireisme
(empireisme)
時間推噓25 推:25 噓:0 →:80

如題

看了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留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.226.11.41 (臺灣)
PTT 網址

tnfshjcc03/04 11:22給個箭頭等Job警察

tnfshjcc03/04 11:25洗杯子機器如果可以接受Cup而非每種Cup 就省很多功夫

bbser03/04 11:27不是每個class都需要measure這個方法

hanshsu03/04 11:27Google一下啊 QQ

alihue03/04 11:37dependency injection

umum2903/04 11:41岔題一下 用動物或物體當例子實在讓初學者摸不著頭緒

umum2903/04 11:42為什麼不拿實際有用的例子 像logger可以存檔案也可存DB

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

meowyih03/04 11:43哈哈真的,教科書老是用甚麼動物還顏色的,明明真實例子

meowyih03/04 11:43的很多就是不用

umum2903/04 11:44或是DataBaseConnection可以多型成SQL MySQL ProsGre....

umum2903/04 11:45去stackoverflow查 一堆鄉民用的例子都比這些還經典

hanshsu03/04 11:45初學者可能連db都不知道啊...

meowyih03/04 11:45像寫2d遊戲會用各種不同的geometry,然後統一用同一個母

meowyih03/04 11:45類型畫上螢幕不好嗎?大家都愛寫遊戲呀~

gn194314103/04 11:50你家國際牌插座如果只能用國際牌電器,就是GG思密達,

gn194314103/04 11:50抽象化/標準化,搭配多型才能讓系統彈性適應變化

jknm0510a03/04 11:53插頭通常用adapter處理(開新戰場)

gn194314103/04 11:59Adapter比較像處理不同插座(歐規、中國、台灣)的問題

vi00024603/04 12:00買本設計模式看一下吧

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

OriginStar03/04 12:08想成 human.washCup(Cup c) 是不是比較好懂阿

OriginStar03/04 12:10不用為每種杯子都宣告一個method,也少了型態轉換的

OriginStar03/04 12:10code,程式碼會更簡潔好維護

O大的意思是,萬一沒有宣告method在 Cup 中,也可以做的意思? 但我的想法是直接把measure放在 Cup中 那麼所有子類別的Cup都可以用

※ 編輯: empireisme (101.12.69.35 臺灣), 03/04/2021 12:14:36

alihue03/04 12:13樓上 這樣會變成人在洗 c 罩杯

theedge03/04 12:21發文請 implement Job介面

OriginStar03/04 12:22主要是程式碼越變越胖時,要考量維護和擴充性

OriginStar03/04 12:23例如之後有個robot.washCup(Cup c)出現,也比較好維護

OriginStar03/04 12:24當然要作在Cup Class 本身也不是不行,有時要考量類別

soheadsome03/04 12:24現在都馬pattern matching誰跟你多型

OriginStar03/04 12:25的互動,有點難解釋就是了

taipoo03/04 12:30推25樓QQ

jej03/04 12:38多型 你的例子確實用處不多

jej03/04 12:38但實作用在資料庫 可確保存取正確資料表 或欄位

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

jej03/04 12:38或是複雜邏輯運算decorate

jej03/04 12:38或是偵測變化observer

jej03/04 12:38就是你看到設計模式中的那幾個常用模式 好處太多 缺點也有

jej03/04 12:38缺點是能力不到位 維運複雜

jej03/04 12:38或是撰寫者設計模式中毒 維運時名稱和物件運作不相關 混亂

jej03/04 12:52總之就是觀察你們老闆

jej03/04 12:52如果他是屬於找剛畢業 或是巨匠專業 免洗工程師的

jej03/04 12:52勸你還是不要用OO甚至到OO的多型

jej03/04 12:52如果老闆的老闆有鴻圖大業的抱負,老闆傾向找資深工程師

jej03/04 12:52OO就很有用了,在很多開放原始碼的套件都用的很兇

jej03/04 12:52甚至套件EOS之後你還能透過原始碼了解功能

shooter55503/04 12:53杯子自己又不會算 怎麼能把他放在杯子裡 除非你的杯子

shooter55503/04 12:53內建計算機功能

shooter55503/04 12:57物件都不物件了怎麼還能算物件導向

tttkkk03/04 13:02你的問題癥結點是不是在 new 那個陳述?你是不是在想如果

tttkkk03/04 13:02為了改變 c 是屬於那種杯子,還要去改 code,那好像省不

tttkkk03/04 13:02了太多時間?你還要找到整個專案其中相關的程式碼全部把

tttkkk03/04 13:02 Coffee Cup() 改為 TeaCup(),這樣似乎沒有比寫成 Coff

tttkkk03/04 13:02eeCup c = new CoffeeCup() 省掉太多時間,也沒有真的很

tttkkk03/04 13:02好維護對嗎?我相信每個剛接觸多型且心思比較細膩的人都

tttkkk03/04 13:02會有跟你一樣的疑問。會有這種疑問是因為這些範例都只講

tttkkk03/04 13:02了一半,進階的後半段是如何利用多型的概念往上疊加其他

tttkkk03/04 13:02作法使其變成好維護的專案。你可以查一下上面有人提到的

tttkkk03/04 13:02 dependency injection,或是再加上 Spring 關鍵字可能會

tttkkk03/04 13:02有更清楚的範例。

shadow1023003/04 13:22你講的寫法也可以沒錯,兩個各有優缺。measure 定義

shadow1023003/04 13:22在 cup 的好處是,新增 cup 的的時候,其他 measur

shadow1023003/04 13:22e 不會被修改到,壞處是,新增 method,比方說 cle

shadow1023003/04 13:22anup() 的時候,所有 cups 都需要被修改。相反地,

shadow1023003/04 13:22把 measure 定義在外的話,新增 cup,measure 就需

shadow1023003/04 13:22要修改,但新增 wash 的時候,所有 cup 都不用被修

shadow1023003/04 13:22改。

shadow1023003/04 13:31你可以根據你開發的功能重視新增 class 還是新增 m

shadow1023003/04 13:31ethod,決定適合哪一種寫法

ucrxzero03/04 14:43請問樓上 工廠模式不就是這樣嗎?

ucrxzero03/04 14:44我可不可以說多型的應用層面就是工廠模式

ucrxzero03/04 14:44先不說動態binding那些東東

ucrxzero03/04 14:44光以code的可擴展性與複用性

ucrxzero03/04 14:47開放封閉原則

empireisme03/04 15:39對謝謝tt大

qrtt103/04 17:41https://bit.ly/3q9bd1m 參考一下 Java 版的討論吧

pichubaby03/04 17:56toString() 通常都是多型的最佳案例

Hsins03/04 18:39haha 哥怎麼沒出現

jackflu03/04 19:38YT搜: 4.7: Introduction to Polymorphism

jackflu03/04 19:39影片長 8:46 頻道:The Coding Train

wulouise03/04 21:11measure的主詞不是cup, 可能是人或機器,至於用base typ

wulouise03/04 21:11e的原因,是邏輯共用,只有實作有差

jackflu03/04 23:18網址支援: https://youtu.be/qqYOYIVrso0

empireisme03/05 00:07謝謝

virnux03/05 01:08你講的沒有錯 是這個例子太單純 你提出的方法跟他的方法差

virnux03/05 01:09異不大 但是如果measure方法換成比較複雜的計算它就不適合

virnux03/05 01:10放在cup類別裡

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

internetms5203/05 08:06ure方法都一樣,如果有人不一樣,就要override方法

internetms5203/05 08:06,如果有人不只不一樣,還剛好有一群是用那個不一

internetms5203/05 08:06樣的方法,你就會寫一樣的東西寫到懷疑人生,最後

internetms5203/05 08:06把他拉成一個interface,叫measurable

aidansky098903/05 09:27因為你不會希望不同物件耦合在一起

shooter55503/05 13:16我覺得多型這個翻譯很容易讓人無法理解 為什麼不翻多

shooter55503/05 13:17態呢 明明是仿造自然界的變態行為

shooter55503/05 13:20父類別 蛙 行為 移動 子類別蝌蚪 幼蛙 成蛙

shooter55503/05 13:22蝌蚪.移動() 幼蛙.移動() 成蛙.移動() 行為界面一樣

shooter55503/05 13:23但內容動作不同不就是多型(態)了

youtuuube00003/05 16:12蠻意外這個主題會這麼多人回...

terrybob03/05 16:34感謝各方高手的說法,受教了…

GoodFriday03/06 00:49好多佛心大大~

longlongint03/06 17:39因為給初學者的範例不能太難,所以會有這種疑惑

superpandal03/09 06:03培訓機構? 反覆推敲是基本

superpandal03/09 06:07真的無自學力可以考慮適不適合

superpandal03/09 06:37連推說多人...