虚方法/非虚方法 < 实例方法 = 非静态方法 = 非类方法(非实例方法 = 静态方法 = 类方法)
函数签名(参数列表,或参数列表 + 返回类型)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace m1w3d5_virtual
  7. {
  8. #region 多态 用虚方法实现
  9. //多态实现 真的鸭子嘎嘎叫,木头鸭子吱吱叫,橡皮鸭子唧唧叫
  10. //多态 不同的实际对象,在同一个指令(叫),有不同的表现
  11. //不同的对象,如何统一管理 里氏转换:可以把子级当父级 如果这些不同的对象全继承自一个父类
  12. //统一管理 如果把子级转换成了父级,子级的特性丢失了
  13. //用虚方法可以 用父级管理并且保留子级的特性 已解决问题
  14. //1,在实例方法前加 virtual
  15. //2,在派生类中用 override 重写 同名/同签名的方法
  16. //在一个虚方法被调用时,会根据最后重写的那个方法和实际类型来决定
  17. //不会根据当前类型来执行方法
  18. class Duck
  19. {
  20. public string name;
  21. public virtual void Cry()
  22. {
  23. Console.WriteLine(",我是{0}", name);
  24. }
  25. }
  26. class TrueDuck : Duck
  27. {
  28. public TrueDuck()
  29. {
  30. this.name = "真的鸭子";
  31. }
  32. public override void Cry()
  33. {
  34. Console.Write("嘎嘎");
  35. base.Cry();
  36. }
  37. }
  38. class WoodDuck : Duck
  39. {
  40. public WoodDuck()
  41. {
  42. this.name = "木头鸭子";
  43. }
  44. public override void Cry()
  45. {
  46. Console.Write("吱吱");
  47. base.Cry();
  48. }
  49. }
  50. class RubberDuck : Duck
  51. {
  52. public RubberDuck()
  53. {
  54. this.name = "橡皮鸭子";
  55. }
  56. public override void Cry()
  57. {
  58. Console.Write("唧唧");
  59. base.Cry();
  60. }
  61. }
  62. //
  63. class BeiJingDuck : TrueDuck
  64. {
  65. public BeiJingDuck()
  66. {
  67. this.name = "北京烤鸭";
  68. }
  69. public override void Cry()
  70. {
  71. Console.WriteLine("欢迎光临,我是{0}",name);
  72. //base.Cry();
  73. }
  74. }
  75. #endregion
  76. #region 多态 练习
  77. //打卡 时间有不同
  78. class Person
  79. {
  80. public string name;
  81. public virtual void PunchCard()
  82. {
  83. Console.WriteLine(",我是{0}",name);
  84. }
  85. }
  86. class Employee : Person
  87. {
  88. public Employee()
  89. {
  90. this.name = "员工";
  91. }
  92. public override void PunchCard()
  93. {
  94. Console.Write("{0},九点打卡", DateTime.Now);
  95. base.PunchCard();
  96. }
  97. }
  98. class Manager : Person
  99. {
  100. public Manager()
  101. {
  102. this.name = "经理";
  103. }
  104. public override void PunchCard()
  105. {
  106. Console.Write("{0},十一点打卡", DateTime.Now);
  107. base.PunchCard();
  108. }
  109. }
  110. class Programmer : Person
  111. {
  112. public Programmer()
  113. {
  114. this.name = "程序员";
  115. }
  116. public override void PunchCard()
  117. {
  118. Console.Write("{0},不用打卡", DateTime.Now);
  119. base.PunchCard();
  120. }
  121. }
  122. #endregion
  123. class Program
  124. {
  125. static void Main(string[] args)
  126. {
  127. #region 多态 用虚方法实现
  128. Random roll = new Random();
  129. TrueDuck trueduck = new TrueDuck();
  130. WoodDuck woodduck = new WoodDuck();
  131. RubberDuck ruberduck = new RubberDuck();
  132. trueduck.Cry();
  133. woodduck.Cry();
  134. ruberduck.Cry();
  135. Console.WriteLine();
  136. //当你转换成父类的时候,你会丢失子类的特性
  137. Duck[] ducks = new Duck[];
  138. for (int i = ; i < ducks.Length; i++)
  139. {
  140. int num = roll.Next(, );
  141. if (num < )
  142. {
  143. ducks[i] = new RubberDuck();
  144. }
  145. else if (num < )
  146. {
  147. ducks[i] = new WoodDuck();
  148. }
  149. else if (num < )
  150. {
  151. ducks[i] = new WoodDuck();
  152. }
  153. else
  154. {
  155. ducks[i] = new BeiJingDuck();
  156. }
  157. }
  158. foreach (var item in ducks)
  159. {
  160. item.Cry();
  161. }
  162. Console.WriteLine();
  163. #endregion
  164. #region 多态 练习
  165. //打卡 时间有不同
  166. Employee employee = new Employee();
  167. Manager manager = new Manager();
  168. Programmer programmer = new Programmer();
  169. employee.PunchCard();
  170. manager.PunchCard();
  171. programmer.PunchCard();
  172. Console.WriteLine();
  173. #endregion
  174. }
  175. }
  176. }

C#学习笔记(十四):多态、虚方法和抽象类的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  3. C++学习基础十二——纯虚函数与抽象类

    一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...

  4. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  5. angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  6. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  7. Swift学习笔记十四:构造(Initialization)

         类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态.     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...

  8. JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)

    1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...

  9. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  10. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

随机推荐

  1. WordPress已占全球网站平台18.9%的份额

    Automattic创始人马特·穆伦维格(Matt Mullenweg)在旧金山的WordCamp会议上谈到了旗下博客平台WordPress的最新发展情况.WordPress平台已成为全球18.9%网 ...

  2. hadoop备战:yarn框架的简单介绍(mapreduce2)

    新 Hadoop Yarn 框架原理及运作机制 重构根本的思想是将 JobTracker 两个基本的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控.新的资源管理器全局管理全部应用程序计 ...

  3. Rufus 制作 USB 启动盘简单教程

    制作 Windows 10 启动盘 U盘 / USB 安装盘图文教程  http://rufus.akeo.ie/downloads/rufus-2.2p.exe 1.将U盘连接到电脑,以管理员身份运 ...

  4. 十天精通CSS3(6)

    属性选择器 在HTML中,通过各种各样的属性可以给元素增加很多附加的信息.例如,通过id属性可以将不同div元素进行区分. 在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进 ...

  5. [py]django模板继承

    参考 1.展示arr,d等数据类型 2.逻辑for if / url获取 3.获取内置变量 django模板继承 通过搞一个base.html 这个base.html可以包含两类 block片断 其他 ...

  6. mysql 用户授权命令

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_root_password' WITH GRANT OP ...

  7. 怎么申请 bing api key

    1:打开网址 https://login.live.com/ 注册帐号并登录(点击上图中的登录按钮即可),在新窗口点击下方的“立即注册”(有帐号的可以直接登录) 2:填写相关信息(推荐使用hotmai ...

  8. Ghost硬盘对拷

    Ghost硬盘对拷 优点:全盘完全100%对拷,包括原有操作系统也可使用.新硬盘对拷结束后,可直接插上电脑使用.消耗时间最短. 困难:对于第一次操作Ghost对拷的新人来说,需要严格对照图片步骤教程. ...

  9. BCB ERROR:[Linker Error] 'XXX.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

    今天C++builder 导入 gts .lib  (gts.dll)库文件 编译报错: [Linker Error] 'D:\...\V4.05.007.1000-20161028\GTS.LIB' ...

  10. Javascript-涨工资案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...