父类与子类间的隐藏与重写例子(改写一题面试题)
(1)隐藏 当分别位于父类和子类的两个方法完全一样时,调用哪个方法由对象变量的类型决定。 using System; public class A { public A() { Console.WriteLine("A"); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B : A { public B() { Console.WriteLine("B"); } public new void Fun() { Console.WriteLine("B.Fun()"); } public static void Main() { A a = new A(); //A a.Fun(); //A.Fun(); B b = new B(); //A B 创建子类对象时,先调用父类构造函数,再调用子类构造函数 b.Fun(); //B.Fun(); a = b; a.Fun(); //A.Fun(); (a as B).Fun(); //B.Fun(); (a as A).Fun(); //A.Fun(); Console.ReadKey(); } } (2)重写 将父类方法定义为虚方法,子类重写同名方法后,通过父类变量调用哪个方法由对象变量引用的真实对象决定,而与变量自身所属的类型无关。 using System; public class A { public A() { Console.WriteLine("A"); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B : A { public B() { Console.WriteLine("B"); } public override void Fun() { Console.WriteLine("B.Fun()"); } public static void Main() { A a = new A(); //A a.Fun(); //A.Fun(); B b = new B(); //A B b.Fun(); //B.Fun(); a = b; a.Fun(); //B.Fun(); (a as B).Fun(); //B.Fun(); (a as A).Fun(); //B.Fun(); Console.ReadKey(); } }