看板 C_Sharp 關於我們 聯絡資訊
各位學長好 最近有個想法但做不出來 大概就像是這樣: https://dotnetfiddle.net/GUu7pe Toyota Mazda Ford 這三個不同名稱的類別中 都有一個名為Car的方法 在類別Test中 有一個SetPrice的方法 我想要將Toyota Mazda Ford這三個類別 作為引數引入SetPrice中 並且不希望動到方法SetPrice的內容 依照例子裏面的寫法 如果要將Toyota變更為Mazda 那麼就得變更引數的型別 SetPrice(new Mazda());//這邊可以變沒關係 void SetPrice(Mazda Maker)//方法不希望變更 { Maker.Car(); Console.WriteLine(Taiwan.Price); } 有嘗試自己上網找一些方法 但可能是不得要點,找出來大多不是我要的 請各位學長不吝賜教,感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.165.108.69 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1576900335.A.6AD.html
testPtt: 一個字都不變的話就是重寫一個class12/21 12:44
testPtt: 如果你是要void SetPrice(T Maker):where T:xx{}那就這樣12/21 12:55
testPtt: 裡面還是要轉型的動作12/21 12:56
我是有想到泛型 大概是學藝不精,無法實現我的想法 如果將程式放在建構子內是可以達成我的需求 但偏偏我想用的方法不只一個 也想過用父類別作為引數的型別 但裡面就是還需要轉型 ※ 編輯: berice152233 (1.165.108.69 臺灣), 12/21/2019 13:45:45
testPtt: Maker.Car()用delegate呢12/21 14:05
感謝建議 不過我現在是用其他的方式 但寫得有點複雜 只是想說要再精簡 感覺用委託不會縮短太多
samchung: 改成介面+多型的寫法 https://dotnetfiddle.net/l9b2mG12/21 14:54
samchung: 但會改到 SetPrice 的參數型別,各車種也要繼承此介面12/21 14:54
居然還有泛型的做法 真的是太感動了……! 我回家後立刻就來試試看 我發現我說得不夠精確 其他地方完全是可以改的 只是希望固定之後就不要再動了 ※ 編輯: berice152233 (111.83.191.226 臺灣), 12/21/2019 15:04:23
samchung: 其實泛型的做法 1F 就有提過了,我只是順便寫出來 XD 12/21 15:10
當然也很感謝1F 只是很慚愧的我寫不出來 你能寫出來真的是幫了大忙了 ※ 編輯: berice152233 (106.105.207.206 臺灣), 12/22/2019 02:00:02
jass970991: 看不是很懂 感覺你只是需要interface 12/22 15:54
是的... 後來我發現繼承抽象類別或虛擬方法也可以做到一樣的事情 我最一開始是使用普通繼承 並在方法加new 用父類別當作引數的型別時 發現還是叫到父類的方法 所以就下意識以為抽象和介面也都是這樣 看書自學時總覺得沒什麼問題 有些觀念真的是要下去寫才能體會 ※ 編輯: berice152233 (59.125.120.238 臺灣), 12/23/2019 11:09:11
ssccg: 因為new就不是一般OOP繼承時的行為,是定義同名方法隱藏父 12/25 09:55
ssccg: 類中的方法,virtual才是比較常見的OOP行為 12/25 09:59
ssccg: 很多其他OOP語言裡方法預設就是virtual,沒有new這種功能 12/25 10:07
zenuo: 用interface 在個別實作三個類別 12/26 15:39