先看代码
using System;
namespace Object
{
public class Pet {
public string name;
public void PrintName() {
Console.WriteLine("printName: pet name:" + name);
}
virtual public void Print()
{
Console.WriteLine("virtual print: 这是Pet:" + name);
}
}
public class DOG : Pet
{
/**
* 屏蔽父类同签名方法 (前面+new,否则报警告)
*/
new public void PrintName() {
Console.WriteLine("printName:这是DOG:" + name);
}
/**
* 方法重写
*/
public override void Print()
{
Console.WriteLine("print:派生类方法重写!这是DOG:" + name);
//base.print();
}
}
public class Cat : Pet
{
/**
* 方法重写
*/
public override void Print()
{
Console.WriteLine("print:派生类方法重写!这是cat:" + name);
//base.print();
}
}
class Program
{
static void Main(string[] args)
{
Pet dog = new DOG();
dog.name = "jack";
dog.PrintName();//虽然屏蔽了父类的方法,但是由于dog用的是父类的引用,此处调用父类的PrintName
dog.Print(); //方法重写,调用新方法
DOG ldog = new DOG();
ldog.name = "little jack";
ldog.PrintName();//屏蔽了父类的方法,此处调用自己的PrintName
ldog.Print();//方法重写,调用新方法
Pet cat = new Cat();
cat.name = "jerry";
cat.PrintName();//调用父类方法
cat.Print();//方法重写,调用新方法
}
}
}
执行结果
由此可见
-
在派生类中,可以使用new关键字屏蔽(覆盖)基类的同签名的方法(注意,不加new不报错,只是警告)
-
如果使用基类的引用(子类的的对象使用了基类的引用)尝试调用使用new屏蔽的方法时,会调用基类方法,而不是调用子类中的新方法
-
基类中使用virtual定义的虚方法,可以在子类中重写,当然也可以不重写
-
如果使用基类的引用调用被子类重写的方法,依然会调用子类中重写的方法