PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_Sharp
[问题] 请教 向上/向下转型 的问题
楼主:
berice152233
(WASHI买的zenfone2)
2019-11-21 17:31:10
各位学长好
我在看深入浅出C#的时候有一个疑问
第一版(买的时候没注意...)
P267、P268的部分有谈到向上、向下转型
就我个人的理解
例如父类有A方法,子类有B、C方法
向上转型:
将子类别的物件内容等同于父类
父类名 物件1 = new 子类名();
原本子类物件可以使用A、B、C方法
向上转型后的物件1就只能使用父类的A方法
向下转型:
将向上转型的物件,用一个新物件再转回来
上面的子类物件现在只能用A方法
那我再用一个物件让他转回来(???)
子类名 物件2 = 物件1 as 子类名;
这样物件2就能使用A、B、C三种方法
在这里我就有问题了
为什么要这样向上向下转型?
如果直接new一个新的父类物件
效果不就等同向上转型后的物件吗?
如果直接new一个新的子类物件
效果不就等同向下转型后的物件吗?
有什么情况非得要用向上、向下转型不可呢?
请各位学长不吝指教,感谢
作者:
s4300026
(s4300026)
2019-11-21 18:21:00
不,你搞错了,真相只有一个,就是实体只有一个。其他都是标签纸,is是判断能不能把标签贴在实体上,as是回传一个已经贴在上面,并且标签名称是你指定的。实体就是你new出来的东西,new回传的东西也是标签纸。然后第三句话,标签名称要改成标签型态。=================那为什么要向上转型,因为你很懒,当你有一堆子类别时,你不想要宣告一堆变量去记住实体在哪,父类别都可接,还可以直接用爸爸的方法,当你真的要用儿子的方法时,再向下转型就好了。
楼主:
berice152233
(WASHI买的zenfone2)
2019-11-21 22:45:00
感谢,有点复杂,我会努力理解的
作者:
samchung
(不是咖啡店小开XD)
2019-11-21 23:18:00
推s大的标签纸形容 XD小弟想到物件集合(或物件阵列)的应用情况请参考范例
https://dotnetfiddle.net/KNvWy4
关键在泛型集合使用父类别的型别才可在集合内放入相同血缘关系的父、子物件
作者:
Litfal
(Litfal)
2019-11-22 09:15:00
标签纸赞赞 至于为什么要转, 得从OOAD最基本的收纳与使用来想。你有一些铅笔和一个铅笔盒,铅笔盒只能放铅笔,那你拿到原子笔时就会有点麻烦。你有两个选择:1.做一个原子笔盒拿来放原子笔。2.把铅笔和原子笔都视为笔,并把铅笔和改成笔盒,可以放所有种类的笔。 盒想当然是2.比较好,你也不想包包里塞满各种类的笔盒吧?而且未来有其他种类的笔,也是直接塞进笔盒里就好。这是收纳部分。而使用上,管他什么笔,都可以用来写所以会在父项 笔 的类别里面,定义 写() 的方法你从笔盒里面拿出的笔,管它是什么笔,拿出来就可以写()至于各种笔自己独特的功能,例如多色笔可以换色,自动笔可以换笔芯,铅笔可以被削,这些功能就由子类别个别去实作向下转型的需求就由此而来。例如你有台削铅笔机,它只吃铅笔。原本随便从铅笔盒拿出一支笔都能削,现在,你必须检查(或是由削铅笔机检查)你从笔盒拿出的笔,它是不是铅笔,确定是铅笔后才能把它塞给削铅笔机来削
作者:
s4300026
(s4300026)
2019-11-22 10:55:00
实际上标签纸的概念是出于 深入浅出 C#,也就是你正在读的那本,那本书上的圆圈就是实体,方框内的名称就是标签。 XD实际上,在实务上只有强调转型,我们并不在乎是 “向上还是向下转型”,在后面的章节,interface的关键字,你就会体会到了。
作者:
nickboy
(残心)
2019-12-06 17:07:00
我基本上都用向下居多,向上是懒惰的时候才会用
继续阅读
[问题] 请教 无瑕的程式码 C# 内容的问题
berice152233
[问题]Scrollbar 宽度调整
iloveduck
[问题] Winform 控件会失效
nietz
[问题] Queue 接收 byte[] 内存持续上升
abc95007
[问题] View 使用 tuple传值到controller
KAINTS
[问题] DataTable的图片string转图档
vanchy
sqlbulkcopy vs seq
sicao
[问题] 如何在现有专案中再加入新的model (MVC5)
KAINTS
[问题] listbox 改变使用者自行改变字串问题?
ChenRobert
.net技术栈有哪些
tree581
Links
booklink
Contact Us: admin [ a t ] ucptt.com