[問題] 基礎類別物件 轉 衍生類別物件

作者: 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