virtual 虚拟的
被virtual标记的方法或属性,本质上是在内存空间中做了定义,但其对应的地址是不固定的,是在运行时根据规则来判定的。
A类 对象名=new B类(),A类叫做申明类,B类叫做实例类
规则:
1 当调用方法时,先检查在申明类中该方法是否是virtual,如果不是虚方法则直接执行,如果是虚方法则需检查实例类。
2 在实例类中检查是否有override该方法,如果有则直接调用该方法,如没有则在其父类中逐级查找,直到找到第一个override方法。
注意 被virtual标记的方法被override,override的方法也是virtual的
代码小练习
1 class People 2 { 3 public virtual void SayHi() 4 { 5 Console.WriteLine("打招呼!"); 6 } 7 } 8 9 class Student:People 10 { 11 public override void SayHi() 12 { 13 Console.WriteLine("学生好!"); 14 } 15 } 16 17 class Teacher:People 18 { 19 public new void SayHi() 20 { 21 Console.WriteLine("老师好!"); 22 } 23 } 24 25 class XY:Student 26 { 27 } 28 static void Main(string[] args) 29 { 30 People p0 = new People(); 31 People p1 = new Student(); 32 People p2 = new Teacher(); 33 People p3 = new XY(); 34 35 p0.SayHi(); 36 p1.SayHi(); 37 p2.SayHi(); 38 p3.SayHi(); 39 Console.ReadKey(); 40 }
代码分析:
p0.SayHi();p0申明类和实例类都是Person 输出 打招呼!
p1.SayHi();p1实例类是Student,重写了申明类Person的SayHi方法,输出 学生好
p2.SayHi();p2实例类是Teacher,没有重写,父类Person虚方法,输出 打招呼!
P3.SayHi();p3实例类是XY,XY中没有重写,父类Student中重写了,输出 学生好
new
new关键在在面向对象中,有两种功能,其一是调用构造方法,创建对象,开辟空间
另一是覆盖基类的方法或属性
new 和override的区别
1 两个关键字都是用于继承中
2 override 只能用于virtual abstract override修饰的方法或属性
3 new 可用于非abstract,非override修饰的方法或属性,调用时取决于申明类的类型
不用new也能构成覆盖。
Base
调用基类方法(构造方法和其他方法)
1 class People 2 { 3 public string Name { get; set; } 4 5 public People() 6 { 7 } 8 9 Public People(string nane) 10 { 11 this.Name = name; 12 } 13 14 public virtual void SayHi() 15 { 16 Console.WriteLine("{0},你好!",); 17 } 18 } 19 20 class Student:People 21 { 22 public Student() 23 { 24 } 25 26 public Student(string name):base(name) 27 { 28 } 29 30 public override void SayHi() 31 { 32 base.SayHi(); 33 } 34 }