父类引用指向子类对象时调用方法,如果用是override重写,执行的是子类的方法;如果用的是new覆盖,执行的是父类的方法。如果看了上面那句话,你还不是很懂,请看下面的代码,就肯定能明白啦!.
public class BaseClass
{
public virtual void PrintSomething()
{
Console.WriteLine("执行了 父类 方法!");
}
}
public class DerivedClass : BaseClass
{
public override void PrintSomething()
{
Console.WriteLine("执行了 子类 方法!");
}
}
public static void Main(string[] args)
{
BaseClass instance = new DerivedClass(); //父类引用指向子类对象
instance.PrintSomeThing();
}
//输出:执行了 子类 方法!
如果换成new的话,请看下面:
public class BaseClass
{
public virtual void PrintSomething()
{
Console.WriteLine("执行了 父类 方法!");
}
}
public class DerivedClass : BaseClass
{
public new void PrintSomething()
{
Console.WriteLine("执行了 子类 方法!");
}
}
public static void Main(string[] args)
{
BaseClass instance = new DerivedClass(); //父类引用指向子类对象
instance.PrintSomething();
}
//输出:执行了 父类 方法!
现在明白了吧!如果是父类引用指向父类对象,当然是执行父类方法;同样滴,子类引用指向子类对象,当然执行子类方法;如果是父类引用指向子类对象呢?就是上面讲的:子类用override重写,该引用会向上传递到,执行子类方法;而如果是用new覆盖的话,相当于是对父类隐藏了此方法,故而执行父类方法。