[問題] 請問如何將類別作為引數傳遞?

看板C_Sharp作者 (WASHI)時間4年前 (2019/12/21 11:52), 4年前編輯推噓2(2010)
留言12則, 5人參與, 4年前最新討論串1/1
各位學長好 最近有個想法但做不出來 大概就像是這樣: 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

12/21 12:44, 4年前 , 1F
一個字都不變的話就是重寫一個class
12/21 12:44, 1F

12/21 12:55, 4年前 , 2F
如果你是要void SetPrice(T Maker):where T:xx{}那就這樣
12/21 12:55, 2F

12/21 12:56, 4年前 , 3F
裡面還是要轉型的動作
12/21 12:56, 3F
我是有想到泛型 大概是學藝不精,無法實現我的想法 如果將程式放在建構子內是可以達成我的需求 但偏偏我想用的方法不只一個 也想過用父類別作為引數的型別 但裡面就是還需要轉型 ※ 編輯: berice152233 (1.165.108.69 臺灣), 12/21/2019 13:45:45

12/21 14:05, 4年前 , 4F
Maker.Car()用delegate呢
12/21 14:05, 4F
感謝建議 不過我現在是用其他的方式 但寫得有點複雜 只是想說要再精簡 感覺用委託不會縮短太多

12/21 14:54, 4年前 , 5F
改成介面+多型的寫法 https://dotnetfiddle.net/l9b2mG
12/21 14:54, 5F

12/21 14:54, 4年前 , 6F
但會改到 SetPrice 的參數型別,各車種也要繼承此介面
12/21 14:54, 6F
居然還有泛型的做法 真的是太感動了……! 我回家後立刻就來試試看 我發現我說得不夠精確 其他地方完全是可以改的 只是希望固定之後就不要再動了 ※ 編輯: berice152233 (111.83.191.226 臺灣), 12/21/2019 15:04:23

12/21 15:10, 4年前 , 7F
其實泛型的做法 1F 就有提過了,我只是順便寫出來 XD
12/21 15:10, 7F
當然也很感謝1F 只是很慚愧的我寫不出來 你能寫出來真的是幫了大忙了 ※ 編輯: berice152233 (106.105.207.206 臺灣), 12/22/2019 02:00:02

12/22 15:54, 4年前 , 8F
看不是很懂 感覺你只是需要interface
12/22 15:54, 8F
是的... 後來我發現繼承抽象類別或虛擬方法也可以做到一樣的事情 我最一開始是使用普通繼承 並在方法加new 用父類別當作引數的型別時 發現還是叫到父類的方法 所以就下意識以為抽象和介面也都是這樣 看書自學時總覺得沒什麼問題 有些觀念真的是要下去寫才能體會 ※ 編輯: berice152233 (59.125.120.238 臺灣), 12/23/2019 11:09:11

12/25 09:55, 4年前 , 9F
因為new就不是一般OOP繼承時的行為,是定義同名方法隱藏父
12/25 09:55, 9F

12/25 09:59, 4年前 , 10F
類中的方法,virtual才是比較常見的OOP行為
12/25 09:59, 10F

12/25 10:07, 4年前 , 11F
很多其他OOP語言裡方法預設就是virtual,沒有new這種功能
12/25 10:07, 11F

12/26 15:39, 4年前 , 12F
用interface 在個別實作三個類別
12/26 15:39, 12F
文章代碼(AID): #1T_PRlQj (C_Sharp)