[问题] 基础类别物件 转 衍生类别物件

楼主: kisha024 (4545454554)   2017-07-09 14:39:42
各位好
我自己定义一个基础类别BaseClass 和 衍生类别DerdivedClass
public class BaseClass {}
public class DerdivedClass : BaseClass {}
如下 我把BaseClass 转成DerivedClass 会出错
DerivedClass A2 = (DerivedClass)new BaseClass();
但如果是底下写法 就不会有错
Button btn = (Button)this.FindControl("Button1");
FindControl所回传的是Control 因为 Button : WebControl 且 WebControl : Control
所以 对Button来说 Control是基础类别 Button是衍生类别
那为什么
DerivedClass A2 = (DerivedClass)new BaseClass(); 会出错
Button btn = (Button)this.FindControl("Button1"); 却不会出错呢?
程式码
https://www.sendspace.com/file/gslh86
谢谢
作者: J002 (阿里山 我来了XD~)   2017-07-09 14:52:00
A2 new出来后是BaseClass,不是DerivedClass,所以会出错但Button1本身就是一个Button,只是用FindControl找他的时候会用Control这类别去找,所以从Control转成Button时不会出错
作者: s4300026 (s4300026)   2017-07-09 21:27:00
这正常吧? 首先,冰箱是电器的一种,但冰箱不是电器,这就是基底与衍伸的差别,然后你有个找电器的方法,找到一个冰箱,然后你说它是一个冰箱,这样有什么问题吗?然后你的new是你有一个电器,但你说它是冰箱,那就会出错啦!因为它可能是电视啊!然后像我回传值都是用object基底在沟通,然后再进行is,as后处理
作者: vi000246 (Vi)   2017-07-09 22:36:00
这就跟float能转int 但int不能转float一样的道理可以google一下装箱跟拆箱
作者: IKAFIRE (没有)   2017-07-09 23:34:00
float int互转和装拆箱无关,完全是另一个议题
作者: shadow0326 (非议)   2017-07-10 02:21:00
这是工厂方法的一种,Create和FindControl这两个API都传入你想要的物件名称了,所以得到的会是子物件的实体以前前面的例子来说,假设电器行提供一个"买电器"的API,你都说要买冰箱了,买到的电器就会是冰箱
作者: s4300026 (s4300026)   2017-07-10 06:10:00
有判断的机制,叫做是否(is)和视为(as), 这是关键字喔~create的传入值就是问你要哪种物品我觉得应该是,但你可以试试看寻找别类控件,然后转型成button看看会不会失败
作者: J002 (阿里山 我来了XD~)   2017-07-11 23:20:00
如果是您提到的stackoverflow中讲的UserProfile,我想应该与他后面提到的web.config有关,他有直接在web.config中设定profile的部份抱歉,拖到今天才看到@@"

Links booklink

Contact Us: admin [ a t ] ucptt.com