17. 动态多态性

Posted LiuChangwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17. 动态多态性相关的知识,希望对你有一定的参考价值。

1、什么是动态多态性?

  在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

2、有什么作用?

  (1)实现“功能定义”与“功能实现”的“脱离”,实现代码的进一步灵活性;
  (2)“系统设计”与“系统代码”实现之间进行“脱离”;
  (3)实现代码的稳定性,减少系统BUG 。

3、总结:

  (1)多态性 new 的时候,声明他的子类;然后子类方法重写或者实现父类接口的方法等;
  (2)子类对象可以赋值给父类对象,但使用中只能使用父类定义的方法。

4、实现方式:
  (1虚方法的动态多态性:
  父类中存在虚方法virtual),子类中重写了对应父类虚方法。子类对象赋值给父类对象时,系统会出现动态多态性;
  (2抽象方法的动态多态性;
  (3接口方法的动态多态性(推荐) 。


  注:能使用抽象方法就不使用虚方法,能使用接口就不使用抽象。

 1 //例1:虚方法实现动态多态性
 2 namespace ProgramTast1
 3 {
 4     //新建一个Person父类
 5     class Person
 6     {
 7         //虚方法实现动态多态性
 8         public virtual void SpeakLanguage()
 9         {
10             Console.WriteLine("Person,说话方法。");
11         }
12     }
13     //新建一个MeLiu子类继承父类
14     class MrLiu:Person
15     {
16         //方法重写
17         public override void SpeakLanguage()
18         {
19             Console.WriteLine("MrLiu,说话");
20         }
21     }
22     //新建一个Tom子类继承父类
23     class Tom:Person
24     {
25         //方法重写
26         public override void SpeakLanguage()
27         {
28             Console.WriteLine("Tom,说话");
29         }
30     }
31     //新建一个测试类Test
32     class Test
33     {
34         //测试实现动态多态性
35         static void Main(string[] args)
36         {
37             //实例化MrLiu调用重写方法
38             Person per = new MrLiu();                       //功能的定义部分
39             per.SpeakLanguage();                            //功能的实现部分
40 
41             //实例化Tom调用重写方法
42             Person per1 = new Tom();
43             per1.SpeakLanguage();
44             Console.ReadKey();
45         }
46     }
47 }

 

 

 1 例2:接口实现多态性
 2 namespace ProgramTast2
 3 {
 4     //定义接口
 5     interface ISpeakable
 6     {
 7         //抽象方法
 8         void SpeakLanguage();
 9     }
10     //MrLiu继承接口
11     class MrLiu : ISpeakable
12     {
13         //显示实现
14         void ISpeakable.SpeakLanguage()
15         {
16             Console.WriteLine("MrLiu ,说话");
17         }
18     }
19     //Tom继承接口
20     class Tom : ISpeakable
21     {
22         void ISpeakable.SpeakLanguage()
23         {
24             Console.WriteLine("Tom , 说话");
25         }
26     }
27     //实现多态
28     class Test
29     {
30         //测试实现动态多态性
31         static void Main(string[] args)
32         {
33             //实现1
34             ISpeakable Ispeak1 = new MrLiu();
35             Ispeak1.SpeakLanguage();
36             //实现2
37             ISpeakable Ispeak2 = new Tom();
38             Ispeak2.SpeakLanguage();
39             Console.ReadKey();
40         }
41     }
42 }

 

以上是关于17. 动态多态性的主要内容,如果未能解决你的问题,请参考以下文章

多态性和动态铸造

java 代码片段

17有关python面向对象编程的提高多继承多态类属性动态添加与限制添加属性与方法@property

17. 虚析构函数再谈动态绑定多态到底是啥抽象类

python-17-对象多态

动态 Rstudio 代码片段