前言:只要会编程的程序猿都会背的一句话就是面向对象的三大特征是:继承、封装、多态。但是谁能深入的了解呢!今天我把关于自己了解的多态的知识给记录下来,其实我也不会,走一步算一步吧,混了好几年的菜鸟伤不起。
1、多态的定义:
同一操作作用于不同的对象,产生不同的效果,这就是多态。
在C#中支持两种类型的多态性:
(1)编译时的多态性:编译时的多态性是通过重写来实现的。对于非虚成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
(2)运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态通过虚成员实现。
2、虚方法的重写:
虚方法怎么定义的,sorry,大伙翻翻书吧,但是我知道虚方法前面有个关键字,virtual,我写的知识点也是园子里大神讲的,我只是copy一下,哈哈,其实这里的虚方法重写和我们常见的重写有区别的,我们常见的重写是方法名一样,只是该面参数类型和数量的重写,这里的重写是虚方法的重写,方法前面加override关键字,之后只改变方法里面的内容。举个例子:
1 public class AVWoman 2 { 3 protected string Name; 4 public AVWoman() { } 5 public AVWoman(string name) 6 { 7 this.Name = name; 8 } 9 public virtual string PaiAV() //注意了这是虚方法 10 { 11 return Name; 12 } 13 } 14 15 public class CangJingKong : AVWoman 16 { 17 18 public CangJingKong(string name) 19 { 20 this.Name = name; 21 } 22 23 public override string PaiAV() //重写方法 24 { 25 return Name; 26 } 27 } 28 29 public class BoDuoYeJieYi : AVWoman 30 { 31 32 public BoDuoYeJieYi(string name) 33 { 34 this.Name = name; 35 } 36 37 public override string PaiAV() //重写方法 38 { 39 return Name; 40 } 41 } 42 43 public class Test 44 { 45 public static void Main() 46 { 47 AVWoman a = new CangJingKong("WildWar"); 48 Console.WriteLine(a.PaiAV());//输出结果为:WildWar 49 Console.ReadLine(); 50 } 51 }
3、抽象方法
抽象类和抽象方法需要加关键字abstract,子类必须实现所有的抽象方法,代码示例如下:
1 public abstract class AVWoman//抽象类 2 { 3 public abstract string PaiAV(); //注意了这是抽象方法 4 } 5 6 public class CangJingKong : AVWoman 7 { 8 protected string Name; 9 public CangJingKong(string name) 10 { 11 this.Name = name; 12 } 13 14 public override string PaiAV() //重写方法 15 { 16 return Name; 17 } 18 } 19 20 public class Test 21 { 22 public static void Main() 23 { 24 AVWoman a = new CangJingKong("Tokyo-Hot"); 25 Console.WriteLine(a.PaiAV());//输出结果为:Tokyo-Hot 26 Console.ReadLine(); 27 } 28 }
4、密封类和密封方法如果将某方法设为密封方法,那么它父类的该方法必须定义为虚方法,密封方法不可被派生类重写,即密封方法必须是虚方法的重写,代码如下:
1 public abstract class AVWoman//抽象类 2 { 3 public abstract string PaiAV(); //注意了这是抽象方法 4 } 5 6 public class CangJingKong : AVWoman 7 { 8 protected string Name; 9 public CangJingKong(string name) 10 { 11 this.Name = name; 12 } 13 14 public sealed override string PaiAV() //密封方法 15 { 16 return Name; 17 } 18 }