PTT推薦

Re: [請益] 多型用在哪

看板Soft_Job標題Re: [請益] 多型用在哪作者
EricTCartman
(阿ㄆㄧㄚˇ)
時間推噓 4 推:6 噓:2 →:5

※ 引述《empireisme (empireisme)》之銘言:
: 請問多型的用途是?

ㄛ現在ㄉ想法4 沒有多型 只有介面

多型的用例之一

for(auto p_actor : actors)
p_actor->act()

對ㄛ來縮 p_actor實際上到底是什麼 並不重要

我只要知道他是actor會act就好

他有可能是warrior也可能是wizard, but i don't care

那麼寫久了 你就會看到一些反模式

if(auto p_wizard = dynamic_cast<Wizard>(p_actor))
p_wizard->cast_spell()

或者是

virtual void act() override {assert(false); /*not support*/}

前者的問題在於 就算有一種方法能讓dynamic_cast的效能神快

這個代碼卻涉及了對Wizard的知識 代表在統一處理actor的片段中多了一個特例

後者的問題在於 所有actor都應該要能act 為什麼你不支援

有可能是一個程式設計師只想要base class的特定功能 又懶得自己開一個新的

然後class越來越肥 可能大家都看過惹

這就是為什麼java標榜他只能單一繼承 然後又特例獨行搞了個implement interface

其實就是變向要你做到粒度 不然你會越寫越屎


所以縮 如果你只是要介面 為什麼不用template

template對許多不熟悉c++的工程師來說陌生

而且ide支援度不高 所以說c++ 20的concept真是好用

結合繼承的優點 又兼容了介面ㄉ彈性 那就是policy

就算不用policy 也可以用component的pattern

再不然 你也可以用pure abstract class來引入interface的風格


最後 現在go跟rust的interface跟trait 其實講的就是這件事

因為比起繼承還是多型啥的玩意兒 其實大家最關注的還是介面跟行為

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.126.131 (臺灣)
PTT 網址

joe722610703/05 00:45推,重點是介面和行為

cuteSquirrel03/05 00:50前面好可愛

jej03/05 01:14寫中文好嗎 我不想看到平假名

mmonkeyboyy03/05 02:53會用介面的人通常都是同時用很多語言才有語感

final0103/05 08:25明明就是使用的時機不同,什麼教沒有多型。。。。

aidansky098903/05 09:25介面是行為的抽象,多型只是調用不同物件的行為

accessdenied03/05 13:41注音文劣退

samioplg03/05 15:11這開頭我以為我在楓之谷

a73197703/05 17:18推 寫多了也有這種感覺

InvincibleK03/06 20:29注音教學:ㄉ一ㄠˇㄅㄠˋㄌㄜ˙ㄅㄢˇㄓㄨˇㄌㄞˊㄎ

InvincibleK03/06 20:31ㄢˋ一ㄡˇㄇㄟˊ一ㄡˇ一ㄠˋㄕㄨㄟˇㄊㄨㄥˇㄊㄚ

wesley23403/09 16:24打車跟打砲都是打,都是打,但細節的動作不同。OO屎一

wesley23403/09 16:24