作者berice152233 (WASHI)
看板C_Sharp
標題[問題] 請問如何將類別作為引數傳遞?
時間Sat Dec 21 11:52:10 2019
各位學長好
最近有個想法但做不出來
大概就像是這樣:
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://webptt.com/m.aspx?n=bbs/C_Sharp/M.1576900335.A.6AD.html
1F:→ testPtt: 一個字都不變的話就是重寫一個class12/21 12:44
2F:→ testPtt: 如果你是要void SetPrice(T Maker):where T:xx{}那就這樣12/21 12:55
3F:→ testPtt: 裡面還是要轉型的動作12/21 12:56
我是有想到泛型
大概是學藝不精,無法實現我的想法
如果將程式放在建構子內是可以達成我的需求
但偏偏我想用的方法不只一個
也想過用父類別作為引數的型別
但裡面就是還需要轉型
※ 編輯: berice152233 (1.165.108.69 臺灣), 12/21/2019 13:45:45
4F:→ testPtt: Maker.Car()用delegate呢12/21 14:05
感謝建議
不過我現在是用其他的方式
但寫得有點複雜
只是想說要再精簡
感覺用委託不會縮短太多
6F:→ samchung: 但會改到 SetPrice 的參數型別,各車種也要繼承此介面12/21 14:54
居然還有泛型的做法
真的是太感動了……!
我回家後立刻就來試試看
我發現我說得不夠精確
其他地方完全是可以改的
只是希望固定之後就不要再動了
※ 編輯: berice152233 (111.83.191.226 臺灣), 12/21/2019 15:04:23
7F:→ samchung: 其實泛型的做法 1F 就有提過了,我只是順便寫出來 XD 12/21 15:10
當然也很感謝1F
只是很慚愧的我寫不出來
你能寫出來真的是幫了大忙了
※ 編輯: berice152233 (106.105.207.206 臺灣), 12/22/2019 02:00:02
8F:推 jass970991: 看不是很懂 感覺你只是需要interface 12/22 15:54
是的...
後來我發現繼承抽象類別或虛擬方法也可以做到一樣的事情
我最一開始是使用普通繼承
並在方法加new
用父類別當作引數的型別時
發現還是叫到父類的方法
所以就下意識以為抽象和介面也都是這樣
看書自學時總覺得沒什麼問題
有些觀念真的是要下去寫才能體會
※ 編輯: berice152233 (59.125.120.238 臺灣), 12/23/2019 11:09:11
9F:→ ssccg: 因為new就不是一般OOP繼承時的行為,是定義同名方法隱藏父 12/25 09:55
10F:→ ssccg: 類中的方法,virtual才是比較常見的OOP行為 12/25 09:59
11F:→ ssccg: 很多其他OOP語言裡方法預設就是virtual,沒有new這種功能 12/25 10:07
12F:推 zenuo: 用interface 在個別實作三個類別 12/26 15:39