父类与子类间的隐藏与重写例子(改写一题面试题)
(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();
}
}