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 }