[请益] 多型用在哪

楼主: 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