首页 > 学院 > 开发设计 > 正文

C#中 父类与子类相互强制转换之实验

2019-11-17 03:10:03
字体:
来源:转载
供稿:网友
C#中 父类与子类相互强制转换之实验

MSDN是很好,不过,有时需要自己动手实践一下,才能更好的理解和记住一些东西。

我看过很多技术文章,结果到用时,仍然是下不了手。似是而非的。

像上次写的“四舍六入五成双/四舍六入五留双/四舍六入五单双”一样,光看MSDN,还是不清楚,直接写一个小例子,就明白了。

这次,搜了一下“基类 派生类 转换”,结果看了,也是不清不楚,不明白。

于是写了一个例子,试一下,就解惑了。不过具体的原理还不清楚,如果有知其所以然的朋友,不吝赐教。

为了让更多和我一样,还在学习过程中的朋友能省时间,在此献丑了,如果你是高手,请指导,不要打击菜鸟的积极性。

代码里有详细的注释,所以就直接上代码了。

[c-sharp]view plaincopy
  1. usingSystem;
  2. usingSystem.Collections;
  3. usingSystem.Configuration;
  4. usingSystem.Data;
  5. usingSystem.Linq;
  6. usingSystem.Web;
  7. usingSystem.Web.Security;
  8. usingSystem.Web.UI;
  9. usingSystem.Web.UI.HtmlControls;
  10. usingSystem.Web.UI.WebControls;
  11. usingSystem.Web.UI.WebControls.WebParts;
  12. usingSystem.xml.Linq;
  13. namespaceWebapplication3
  14. {
  15. ///<summary>
  16. ///a类故意定义2个field
  17. ///</summary>
  18. publicclassa
  19. {
  20. publicstringitema1{get;set;}
  21. publicstringitema2{get;set;}
  22. publicstringPRintItem()
  23. {
  24. returnitema1+itema2;
  25. }
  26. }
  27. ///<summary>
  28. ///b类故意定义1个field,加上继承a类的,共3个field
  29. ///</summary>
  30. publicclassb:a
  31. {
  32. publicstringitemb1{get;set;}
  33. publicstringPrintItemb()
  34. {
  35. returnitema1+itema2+itemb1;
  36. }
  37. }
  38. publicclassd:a
  39. {
  40. publicstringitemd1{get;set;}
  41. publicstringPrintItemd()
  42. {
  43. returnitema1+itema2+itemd1;
  44. }
  45. }
  46. publicclasse:b
  47. {
  48. publicstringiteme1{get;set;}
  49. publicstringPrintIteme()
  50. {
  51. returnitema1+itema2+itemb1+iteme1;
  52. }
  53. }
  54. publicstaticclassc
  55. {
  56. publicstaticageta()
  57. {
  58. returngetb();
  59. }
  60. publicstaticbgetb()
  61. {
  62. bcba=newb(){itemb1="bb1",itema1="bba1",itema2="bba2"};
  63. returncba;
  64. }
  65. }
  66. publicpartialclassWebForm1:System.Web.UI.Page
  67. {
  68. protectedvoidPage_Load(objectsender,EventArgse)
  69. {
  70. //接下来,我们测试一下,将a类和b类实例化,并赋给不同的值。
  71. aaa=newa(){itema1="a1",itema2="a2"};
  72. bbb=newb(){itemb1="b1",itema1="ba1",itema2="ba2"};
  73. aabc=(a)bb;//将有3个field的bb实例,强制转换为只有2个field的a类的abc实例。
  74. //测试一下:会不会像实例生活中,a类袋子只能装2个包子,b类袋子可以装3个包子。
  75. //现将装3个包子的bb袋子,装进只能装2个包子的abc袋子,会不会抛弃掉一个包子。
  76. //结果证明,不会抛弃,只是在abc袋子中,我们只能取出2个包子,而当我们再将abc袋子,强制转换并装回b类袋子的新实例bbc袋子时,3个包子又回来了。
  77. bbbc=(b)abc;
  78. //bdbb=(b)aa;//这里会出错!!提示“无法将类型为“WebApplication3.a”的对象强制转换为类型“WebApplication3.b”
  79. //像上面的包子的比喻,如果没有首先将b类袋子的3个包子放进a类袋子,而是直接将a类袋子,强制转换为b类袋子,那是不行的。先从b到a再到b,这是可行的。
  80. Label1.Text=aa.PrintItem();
  81. Label2.Text=bb.PrintItemb();
  82. Label3.Text=abc.PrintItem();
  83. Label4.Text=bbc.PrintItem();
  84. Label5.Text=bbc.PrintItemb();
  85. Label6.Text=(c.geta()).PrintItem();//这样又可以,
  86. Label7.Text=((b)(c.geta())).PrintItemb();//这样也行。总结出来就是:最初的包子是3个,不管是装哪个类,3个包子是“能量守恒”的/“物质不灭”的,
  87. //只是套在不同的类里,就只能按这个类的“规矩”来办,在a类,只能取出2个,在b类可取出3个。前提是:初次实例化时就有3个包子。
  88. //Label8.Text=((d)(c.geta())).PrintItemd();//这里会出错!!提示“无法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.d”
  89. //Label9.Text=((e)(c.geta())).PrintIteme();//这里会出错!!提示“无法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.e”。
  90. //注意到这个提示“无法将类型为“WebApplication3.b”,c.geta()返回的仍然是类b。而不是geta()方法定义时的a。
  91. }
  92. }
  93. /*运行输出结果为:
  94. a1a2
  95. ba1ba2b1
  96. ba1ba2
  97. ba1ba2
  98. ba1ba2b1
  99. bba1bba2
  100. bba1bba2bb1
  101. */
  102. }

http://four-corner.appspot.com/


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表