国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青岛市| 陕西省| 元阳县| 宜良县| 三穗县| 双流县| 赣榆县| 同德县| 钟祥市| 广西| 六安市| 南宁市| 莫力| 卢湾区| 鄂州市| 大埔县| 赫章县| 阿合奇县| 阳高县| 霍州市| 石景山区| 哈巴河县| 郓城县| 富蕴县| 石嘴山市| 南召县| 视频| 蓬莱市| 香河县| 山东省| 瑞昌市| 兴城市| 磴口县| 桦川县| 玉环县| 文安县| 汤原县| 信丰县| 池州市| 江山市| 临沭县|