作者kisha024 (4545454554)
看板C_Sharp
标题[问题] 基础类别物件 转 衍生类别物件
时间Sun Jul 9 14:39:42 2017
各位好
我自己定义一个基础类别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
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.175.206.19
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1499582386.A.E8F.html
1F:推 J002: A2 new出来後是BaseClass,不是DerivedClass,所以会出错 07/09 14:52
2F:→ J002: 但Button1本身就是一个Button,只是用FindControl找他的时候 07/09 14:53
3F:→ J002: 会用Control这类别去找,所以从Control转成Button时不会出错 07/09 14:53
https://stackoverflow.com/questions/2889158/how-can-i-use-profilebase-class
public class UserProfile : ProfileBase
{
public static UserProfile GetUserProfile(string username)
{
return Create(username) as UserProfile;
}
...............
}
谢谢 会有这个疑问 也是因为不了解为什麽Create()後可以转UserProfile?
因为Create()後 回传的type是ProfileBase
你上述Button1本身就是一个Button...这段叙述 我好像可以理解
但Create() 本身就是UserProfile吗? 是这样解释吗? 还是?
※ 编辑: kisha024 (1.175.206.19), 07/09/2017 20:01:11
4F:推 s4300026: 这正常吧? 首先,冰箱是电器的一种,但冰箱不是电器, 07/09 21:27
5F:→ s4300026: 这就是基底与衍伸的差别,然後你有个找电器的方法,找 07/09 21:27
6F:→ s4300026: 到一个冰箱,然後你说它是一个冰箱,这样有什麽问题吗? 07/09 21:27
7F:推 s4300026: 然後你的new是你有一个电器,但你说它是冰箱,那就会出 07/09 21:29
8F:→ s4300026: 错啦! 07/09 21:29
9F:推 s4300026: 因为它可能是电视啊! 07/09 21:31
10F:推 s4300026: 然後像我回传值都是用object基底在沟通,然後再进行is,a 07/09 21:36
11F:→ s4300026: s後处理 07/09 21:36
谢谢您的比喻 我觉得很贴切
但我的问题在於不知道那个方法是找电器的方法 还是找冰箱的方法?
从FindControl这个字眼上来看 的确是找控制项的方法
只是刚好找到Button 就说他是Button
但判断一个方法要找的东西是什麽 该怎麽判断呢?
请您看一下上面那个Create()方法ProfileBase
Create()是要创造ProfileBase 只是刚好所创的是UserProfile
所以就说他是UserProfile 是这样解释吗?
※ 编辑: kisha024 (1.175.206.19), 07/09/2017 22:18:38
12F:推 vi000246: 这就跟float能转int 但int不能转float一样的道理 07/09 22:36
13F:→ vi000246: 可以google一下装箱跟拆箱 07/09 22:37
14F:→ IKAFIRE: float int互转和装拆箱无关,完全是另一个议题 07/09 23:34
15F:推 shadow0326: 这是工厂方法的一种,Create和FindControl这两个API都 07/10 02:21
16F:→ shadow0326: 传入你想要的物件名称了,所以得到的会是子物件的实体 07/10 02:22
17F:→ shadow0326: 以前前面的例子来说,假设电器行提供一个"买电器"的 07/10 02:23
18F:→ shadow0326: API,你都说要买冰箱了,买到的电器就会是冰箱 07/10 02:23
19F:推 s4300026: 有判断的机制,叫做是否(is)和视为(as), 这是关键字喔~ 07/10 06:10
20F:推 s4300026: create的传入值就是问你要哪种物品 07/10 06:32
您的意思是 用is和as去判断create()後回传值是ProfileBase或UserProfile吗?
create的传入值是个string 您的意思是 光靠传入的string不同
就足以影响回传的值是ProfileBase或UserProfile吗?
21F:推 s4300026: 我觉得应该是,但你可以试试看寻找别类控制项,然後转 07/10 22:42
22F:→ s4300026: 型成button看看会不会失败 07/10 22:42
谢谢 很明显会失败
23F:推 J002: 如果是您提到的stackoverflow中讲的UserProfile,我想应该与 07/11 23:20
24F:→ J002: 他後面提到的web.config有关,他有直接在web.config中设定 07/11 23:21
25F:→ J002: profile的部份 07/11 23:21
26F:→ J002: 抱歉,拖到今天才看到@@" 07/11 23:21
感谢 您太客气了
※ 编辑: kisha024 (60.251.130.137), 07/13/2017 16:48:14