标签:
继承中override virtual new的作用
virtual 父类中需要注明允许重写的方法;
override 子类中必须显示声明该方法是重写的父类中的方法;
new 子类中忽略父类的已存在的方法,“重写该方法“;
C#中不支持隐式重写子类的方法
即如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法(new),而不能覆盖(override);
代码分析
这是一个base类A有很多子类:
1 class A 2 { 3 public virtual void Movie() 4 { 5 Console.WriteLine("MikiMouse"); 6 } 7 } 8 9 class B : A 10 { 11 public override void Movie() 12 { 13 Console.WriteLine("DisneyMovie"); 14 } 15 } 16 17 class C : B 18 { 19 public new virtual void Movie() 20 { 21 Console.WriteLine("Snow White"); 22 } 23 } 24 25 class D : C 26 { 27 public override void Movie() 28 { 29 Console.WriteLine("Seven Dwarfs"); 30 } 31 }
主函数其实也是一个静态(static)的入口函数:
1 static void Main(string[] args) 2 { 3 A objA = new D(); 4 A objB = new B(); 5 C objC = new D(); 6 A objD = new A(); 7 objA.Movie(); 8 objB.Movie(); 9 objC.Movie(); 10 objD.Movie(); 11 }
其中:
A objA = new D(); objA.Movie();
这样用A定义的objA分配的是子类D的空间;
调用Movie()时先看A中的Movie()是虚函数(virtual),所以看A的下一级B,B被override修饰;
所以B中的Movie()覆盖A的函数,所以输出的应该是B中的DisneyMovie;
同理最终输出如下:
C#中类的继承 override virtual new的作用以及代码分析
标签:
原文地址:http://www.cnblogs.com/Elson8080/p/4378947.html