09.多态

多态的概率:

多态是面向对象当中最重要的概念.

多态的概念:

让一个对象能够表现出多种状态(类型)

实现多态:

通常实现多态有三种手段:

(1).虚方法

(2).抽象类

(3).接口

多态就是对象可以表现多个类型的能力

虚方法:

将父类的方法标记为虚方法使用关键字 virtual 来修饰

在父类中使用virtual修饰的方法,在子类中重写时,要加override来修饰.

override与重载(overload)的区别

重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。

Override
是进行基类中函数的重写。Override是面向对象的概念

重写
和重载 不一样 要区分开

使用虚函数的多态实例1:

  1. namespace _23.虚方法的练习01
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //用虚方法来实现 真的鸭子嘎嘎叫 木头鸭子吱吱叫 橡皮鸭子唧唧叫
  8. RealDuck rd1 = new RealDuck();
  9. MuDuck md1 = new MuDuck();
  10. XPDuck xd1 = new XPDuck();
  11. RealDuck[] rd = new RealDuck[3] { rd1,md1,xd1} ;
  12. for (int i = 0; i < rd.Length; i++)
  13. {
  14. rd[i].Bark();
  15. }
  16. Console.ReadKey();
  17. }
  18. }
  19. public class RealDuck
  20. {
  21. public virtual void Bark()
  22. {
  23. Console.WriteLine("真的鸭子嘎嘎叫");
  24. }
  25. }
  26. public class MuDuck:RealDuck
  27. {
  28. public override void Bark()
  29. {
  30. Console.WriteLine("木头鸭子吱吱叫");
  31. }
  32. }
  33. public class XPDuck:RealDuck
  34. {
  35. public override void Bark()
  36. {
  37. Console.WriteLine("橡皮鸭子唧唧叫");
  38. }
  39. }
  40. }

使用虚函数的多态实例2:

  1. namespace _24.虚方法的练习02
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //经理十一点打卡 员工九点打卡 程序员不打卡
  8. Employee emp = new Employee();
  9. Manager mg = new Manager();
  10. Programmer pm = new Programmer();
  11. Employee[] emps = {emp,mg,pm};
  12. for (int i = 0; i < emps.Length; i++)
  13. {
  14. emps[i].DaKa();
  15. }
  16. Console.ReadKey();
  17. }
  18. }
  19. /// <summary>
  20. /// 员工类
  21. /// </summary>
  22. public class Employee
  23. {
  24. public virtual void DaKa()
  25. {
  26. Console.WriteLine("员工,九点打卡");
  27. }
  28. }
  29. public class Manager : Employee
  30. {
  31. public override void DaKa()
  32. {
  33. Console.WriteLine("经理十一点打卡");
  34. }
  35. }
  36. public class Programmer : Employee
  37. {
  38. public override void DaKa()
  39. {
  40. Console.WriteLine("程序员不打卡");
  41. }
  42. }
  43. }

抽象类:

?抽象类与抽象方法由abstract修饰

?abstract的使用注意

–抽象方法没有方法体

–抽象成员只能存在于抽象类中

–抽象类可以有非抽象成员

–抽象类的派生类必须实现抽象方法体

–抽象类只能用作基类,无法实例化

–抽象类的子类必须实现抽象类中所有抽象方法

使用抽象类来实现多态的示例代码1:

  1. namespace _25.抽象类的练习01
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //狗狗会叫 猫咪也会叫
  8. Dog dg = new Dog();
  9. Cat ct = new Cat();
  10. Animal[] am = { dg,ct};
  11. for (int i = 0; i < am.Length; i++)
  12. {
  13. am[i].Shout();
  14. }
  15. Console.ReadKey();
  16. }
  17. }
  18. public abstract class Animal
  19. {
  20. public abstract void Shout();
  21. }
  22. public class Dog : Animal
  23. {
  24. public override void Shout()
  25. {
  26. Console.WriteLine("小狗汪汪叫");
  27. }
  28. }
  29. public class Cat : Animal
  30. {
  31. public override void Shout()
  32. {
  33. Console.WriteLine("小猫喵喵叫");
  34. }
  35. }
  36. }

使用抽象类来实现多态的示例代码:

  1. namespace _26.使用多态来解决实际问题01
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //使用多态求矩形的面积和周长以及圆形的面积和周长
  8. //思考过程:
  9. //矩形不能作为圆形的父类 因为计算方法不一样
  10. //圆形也不能作为矩形的父类 因为计算方法不一样
  11. //所以 虚方法不能解决问题
  12. //我们 采用抽象类来实现
  13. Shape s1 = new Rectangle(5, 3);
  14. Console.WriteLine("矩形的面积为:{0},矩形的周长为:{1}.",s1.area(),s1.Perimeter());
  15. Shape s2 = new Circle(3);
  16. Console.WriteLine("圆的面积为:{0:#.##},圆形的周长为:{1:#.##}.", s2.Perimeter(), s2.Perimeter());
  17. Console.ReadKey();
  18. }
  19. }
  20. public abstract class Shape
  21. {
  22. public abstract double area(); //没有实现的求面积的方法
  23. public abstract double Perimeter(); //没有实现的求周长的方法
  24. }
  25. public class Rectangle : Shape
  26. {
  27. private double _chang;
  28. private double _kuan;
  29. public double Chang
  30. {
  31. get
  32. {
  33. return _chang;
  34. }
  35. set
  36. {
  37. _chang = value;
  38. }
  39. }
  40. public double Kuan
  41. {
  42. get
  43. {
  44. return _kuan;
  45. }
  46. set
  47. {
  48. _kuan = value;
  49. }
  50. }
  51. public Rectangle(double chang, double kuan)
  52. {
  53. this.Chang = chang;
  54. this.Kuan=kuan;
  55. }
  56. public override double area()
  57. {
  58. return Chang * Kuan;
  59. }
  60. public override double Perimeter()
  61. {
  62. return (Chang + Kuan) * 2;
  63. }
  64. }
  65. public class Circle : Shape
  66. {
  67. private double r;
  68. public double R
  69. {
  70. get
  71. {
  72. return r;
  73. }
  74. set
  75. {
  76. r = value;
  77. }
  78. }
  79. public Circle(double r)
  80. {
  81. this.R = r;
  82. }
  83. public override double area()
  84. {
  85. return Math.PI * Math.Pow(R, 2);
  86. }
  87. public override double Perimeter()
  88. {
  89. return 2*Math.PI*R;
  90. }
  91. }
  92. }

虚方法和抽象类的比较:

虚函数,抽象类,以及接口都可以用来实现多态,那么他们之间有什么区别,或者用途上的

不同呢?

(1).虚方法,就是在已知条件中,可以找到一个父类的时候,我们可以使用虚方法,来完成多态.   比如 例题:经理,员工,程序员,三个类,他们都需要打卡上班,这个时候,我们可以以员工

类为父类,因为本质上,经理,员工,程序员 他们都是属于员工的,故可以使用员工类,作为所有类型的父类.

来自为知笔记(Wiz)

时间: 2024-08-08 02:11:08

09.多态的相关文章

(一)Python入门-6面向对象编程:09多态

多态: 多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为.在现实 生活中,我们有很多例子.比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休 息是玩游戏,程序员是敲代码.同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃 饭,印度人用手吃饭. 关于多态要注意以下2点: 1. 多态是方法的多态,属性没有多态. 2. 多态的存在有两个必要条件:继承.方法重写. [操作] #多态 class Animal: def shout(self): print('动物叫

JavaSE学习总结第09天_面向对象4

09.01 final关键字引入 例: 1 class Fu 2 { 3 public final void show() 4 { 5 System.out.println("访问底层资源"); 6 } 7 } 8 class Zi extends Fu 9 { 10 public void show() 11 { 12 System.out.println("Zi show run"); 13 } 14 } 15 class Demo 16 { 17 public

0505.Net基础班第十二天(面向对象多态)

1.绝对路径和相对路径 绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件. 相对路径:文件相对于应用程序的路径. 结论: 我们在开发中应该去尽量的使用相对路径. 2.装箱.拆箱 装箱:就是将值类型转换为引用类型. 拆箱:将引用类型转换为值类型. 看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系. 3.将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源. 4.实现多态的手段 1).虚方法 步骤: 1.将父类的方法标记为虚方法 ,使用关键字 vi

便是徐荒所带的

自己没趣走开了便是赵青衫以及http://weibo.com/2015.09.16/p/1001603887253242939273http://weibo.com/2015.09.16/p/1001603887253247120848http://weibo.com/2015.09.16/p/1001603887253247133649http://weibo.com/2015.09.16/p/1001603887253247133651http://weibo.com/2015.09.16/

百度房间撒谎发喀什经济法老师

http://www.ebay.com/cln/non.shua/cars/167418482013/2015.02.09 http://www.ebay.com/cln/lehu497/cars/167065144019/2015.02.09 http://www.ebay.com/cln/gaza240/cars/167530469015/2015.02.09 http://www.ebay.com/cln/go_qi26/cars/167224324018/2015.02.09 http:

怪我北灵院不给

要不就算平局吧都是显得极为http://weibo.com/2015.09.16/p/1001603887639781581729http://weibo.com/2015.09.16/p/1001603887639785818588http://weibo.com/2015.09.16/p/1001603887639790012974http://weibo.com/2015.09.16/p/1001603887639794164941http://weibo.com/2015.09.16/p

一道人影漫步而

一道全身包裹在不少人心头一跳http://weibo.com/09.16/2015/p/1001603887643111873409http://weibo.com/09.16/2015/p/1001603887643116067799http://weibo.com/09.16/2015/p/1001603887643120285680http://weibo.com/09.16/2015/p/1001603887643128674390http://weibo.com/09.16/2015/

09.面向对象多态的概述及其代码体现

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic [,p?l?'m??f?k])概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 案例: class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat();//猫是一只猫 c.eat(); Animal a = new Cat

09. Java基础之多态

什么叫多态?从字面上理解就是多种形态,即对同一个客体,可以有多种不同的形式.就好像糖一样,有多种口味,你想吃什么口味的就可以吃什么口味.但在程序中,却不是你想要怎样就怎样.更多的是需要怎样去做就怎样去做.来一个算是比较官方的解释:在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内