作者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/cn.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