C#中父类与子类相互强制转换之实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#中⽗类与⼦类相互强制转换之实验MSDN是很好,不过,有时需要⾃⼰动⼿实践⼀下,才能更好的理解和记住⼀些东西。
我看过很多技术⽂章,结果到⽤时,仍然是下不了⼿。
似是⽽⾮的。
像上次写的“”⼀样,光看MSDN,还是不清楚,直接写⼀个⼩例⼦,就明⽩了。
这次,搜了⼀下“基类派⽣类转换”,结果看了,也是不清不楚,不明⽩。
于是写了⼀个例⼦,试⼀下,就解惑了。
不过具体的原理还不清楚,如果有知其所以然的朋友,不吝赐教。
为了让更多和我⼀样,还在学习过程中的朋友能省时间,在此献丑了,如果你是⾼⼿,请指导,不要打击菜鸟的积极性。
代码⾥有详细的注释,所以就直接上代码了。
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace WebApplication3
{
///<summary>
/// a类故意定义2个field
///</summary>
public class a
{
public string itema1 { get; set; }
public string itema2 { get; set; }
public string PrintItem()
{
return itema1 + itema2;
}
}
///<summary>
/// b类故意定义1个field,加上继承a类的,共3个field
///</summary>
public class b : a
{
public string itemb1 { get; set; }
public string PrintItemb()
{
return itema1 + itema2 + itemb1;
}
}
public class d : a
{
public string itemd1 { get; set; }
public string PrintItemd()
{
return itema1 + itema2 + itemd1;
}
}
public class e : b
{
public string iteme1 { get; set; }
public string PrintIteme()
{
return itema1 + itema2 + itemb1+iteme1;
}
}
public static class c
{
public static a geta()
{
return getb();
}
public static b getb()
{
b cba = new b() { itemb1 = "bb1", itema1 = "bba1", itema2 = "bba2" };
return cba;
}
}
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//接下来,我们测试⼀下,将a类和b类实例化,并赋给不同的值。
a aa = new a() { itema1="a1",itema2="a2"};
b bb = new b() { itemb1="b1",itema1="ba1",itema2="ba2"};
a abc = (a)bb;//将有3个field的bb实例,强制转换为只有2个field的a类的abc实例。
//测试⼀下:会不会像实例⽣活中,a类袋⼦只能装2个包⼦,b类袋⼦可以装3个包⼦。
//现将装3个包⼦的bb袋⼦,装进只能装2个包⼦的abc袋⼦,会不会抛弃掉⼀个包⼦。
//结果证明,不会抛弃,只是在abc袋⼦中,我们只能取出2个包⼦,⽽当我们再将abc袋⼦,强制转换并装回b类袋⼦的新实例bbc袋⼦时,3个包⼦⼜回来了。
b bbc=(b)abc;
// b dbb = (b)aa;//这⾥会出错!!提⽰“⽆法将类型为“WebApplication3.a”的对象强制转换为类型“WebApplication3.b”
//像上⾯的包⼦的⽐喻,如果没有⾸先将b类袋⼦的3个包⼦放进a类袋⼦,⽽是直接将a类袋⼦,强制转换为b类袋⼦,那是不⾏的。
先从b到a再到b,这是可⾏的。
Label1.Text= aa.PrintItem();
Label2.Text = bb.PrintItemb();
Label3.Text = abc.PrintItem();
Label4.Text = bbc.PrintItem();
Label5.Text= bbc.PrintItemb();
Label6.Text = (c.geta()).PrintItem();//这样⼜可以,
Label7.Text = ((b)(c.geta())).PrintItemb();//这样也⾏。
总结出来就是:最初的包⼦是3个,不管是装哪个类,3个包⼦是“能量守恒”的/“物质不灭”的,
//只是套在不同的类⾥,就只能按这个类的“规矩”来办,在a类,只能取出2个,在b类可取出3个。
前提是:初次实例化时就有3个包⼦。
// Label8.Text = ((d)(c.geta())).PrintItemd(); //这⾥会出错!!提⽰“⽆法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.d”
// Label9.Text = ((e)(c.geta())).PrintIteme();//这⾥会出错!!提⽰“⽆法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.e”。
//注意到这个提⽰“⽆法将类型为“WebApplication3.b”,c.geta()返回的仍然是类b。
⽽不是geta()⽅法定义时的a。
}
}
/*运⾏输出结果为:
a1a2
ba1ba2b1
ba1ba2
ba1ba2
ba1ba2b1
bba1bba2
bba1bba2bb1
*/
}。