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

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

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

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

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

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

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

  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.Security;
  8. using System.Web.UI;
  9. using System.Web.UI.HtmlControls;
  10. using System.Web.UI.WebControls;
  11. using System.Web.UI.WebControls.WebParts;
  12. using System.Xml.Linq;
  13. namespace WebApplication3
  14. {
  15. /// <summary>
  16. /// a类故意定义2个field
  17. /// </summary>
  18. public class a
  19. {
  20. public string itema1 { get; set; }
  21. public string itema2 { get; set; }
  22. public string PrintItem()
  23. {
  24. return itema1 + itema2;
  25. }
  26. }
  27. /// <summary>
  28. /// b类故意定义1个field,加上继承a类的,共3个field
  29. /// </summary>
  30. public class b : a
  31. {
  32. public string itemb1 { get; set; }
  33. public string PrintItemb()
  34. {
  35. return itema1 + itema2 + itemb1;
  36. }
  37. }
  38. public class d : a
  39. {
  40. public string itemd1 { get; set; }
  41. public string PrintItemd()
  42. {
  43. return itema1 + itema2 + itemd1;
  44. }
  45. }
  46. public class e : b
  47. {
  48. public string iteme1 { get; set; }
  49. public string PrintIteme()
  50. {
  51. return itema1 + itema2 + itemb1+iteme1;
  52. }
  53. }
  54. public static class c
  55. {
  56. public static a geta()
  57. {
  58. return getb();
  59. }
  60. public static b getb()
  61. {
  62. b cba = new b() { itemb1 = "bb1", itema1 = "bba1", itema2 = "bba2" };
  63. return cba;
  64. }
  65. }
  66. public partial class WebForm1 : System.Web.UI.Page
  67. {
  68. protected void Page_Load(object sender, EventArgs e)
  69. {
  70. //接下来,我们测试一下,将a类和b类实例化,并赋给不同的值。
  71. a aa = new a() { itema1="a1",itema2="a2"};
  72. b bb = new b() { itemb1="b1",itema1="ba1",itema2="ba2"};
  73. a abc = (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. b bbc=(b)abc;
  78. // b dbb = (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/

C#中 父类与子类相互强制转换之实验的更多相关文章

  1. java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

    /* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ impo ...

  2. Java中父类和子类代码执行顺序

    执行顺序:父类静态块-->子类静态块-->父类非静态块-->父类构造方法-->子类非静态块-->子类构造方法 当父类或子类中有多个静态方法时按在代码中的顺序执行 pack ...

  3. java中父类和子类初始化顺序

    顺序 1. 父类中静态成员变量和静态代码块 2. 子类中静态成员变量和静态代码块 3. 父类中普通成员变量和代码块,父类的构造函数 4. 子类中普通成员变量和代码块,子类的构造函数 其中“和”字两端的 ...

  4. Java继承中父类和子类构造函数的问题

    父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数:当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类 ...

  5. Java中父类强制转换为子类的可能

    之前徒弟问了一个问题, 在Java中, 父类对象到底能不能转换成对应的子类对象? 到底能不能, 今天就来说说这个问题, 先看下面一段代码: package cn.com.hanbinit.test; ...

  6. java 强制转换

    在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  7. C# is 强制转换

    在平时开发中,经常遇上强制转换,在这过程中经常遇上null对象转换为值类型,如果不判断的情况下在编译的时候不会出错,但程序一运行就抛出错误.好在C#为我们提供了is ,它判断一个对象如果成立就转换,如 ...

  8. C#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)

     托管和非托管资源 1.托管资源是指GC管理的内存空间,非托管资源是指文件句柄,网络连接,数据库连接等. 2.方法中临时申请的变量,被存放在栈中.栈存储非对象成员的值数据.例如在方法中有B b=new ...

  9. C++的子类与父类强制转换产生的问题

    近日,在项目的一个类中如果碰上想要将子类强制转换成父类,然后再调用其父类版本的virtual虚函数. 就会出现gcc编译错误提示:error: ld returned 1 exit status gc ...

随机推荐

  1. 解决centOS7的IP为127.0.0.1,无法用Xshll链接问题

    对于linux不熟悉的我, 安装完centOS7后好多坑,走一步卡一步,记得之前安装其他版本没这么多事.安装完后用ifconfig查看IP,竟然是127.0.0.1,这我就不知道怎么用Xshell链接 ...

  2. 我对于react-router路由原理的学习

    目录 react-router依赖基础--history react-router是如何实现URL与UI同步 一 react-router依赖基础--history history是一个独立的第三方j ...

  3. 关于 Unity 版本升级后可能会引起偶发光照图错乱的问题

    近期项目遇到一个奇怪的问题,使用 Unity 2017 版本升级后,团队中某些人的机器光照图总是不正确,而有的人是正确的,一直不知道为什么. 为了查到这个奇怪问题的原因,首先查看了美术的在 Max 中 ...

  4. https请求过程

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...

  5. innerText和innerHTML, outerHTML

    js中 innerHTML与innerText的用法与区别及解决Firefox不支持Js的InnerHtml问题 用法: <div id="test"> <spa ...

  6. 基于NMAP日志文件的暴力破解工具BruteSpray

    基于NMAP日志文件的暴力破解工具BruteSpray   使用NMAP的-sV选项进行扫描,可以识别目标主机的端口对应的服务.用户可以针对这些服务进行认证爆破.为了方便渗透测试人员使用,Kali L ...

  7. tyvj Easy

    Easy [描述 Description] 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则    有n次点击要做,成功了就是o,失败了就是x,分 ...

  8. BZOJ4599[JLoi2016&LNoi2016]成绩比较(dp+拉格朗日插值)

    这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][ ...

  9. Codeforces 1129 E.Legendary Tree

    Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1​\) 次 \((S=\{1\},T=\{ ...

  10. php上传中文文件文件名乱码问题

    php上传文件是最最基础的一个技术点,但是深入进去也有不少问题需要解决,这不,上传中文文件后,文件名变成了乱码. 下面是问题代码,很简单: 1.问题代码 html部分: <html> &l ...