[转]c#中new、virtual、override用法
子类函数覆盖父类函数的方法总结:
(1)不使用任何修饰符
在不使用任何修饰符的情况下,可以实现覆盖,但是会有警告。
(2)使用new
new用在子类重写父类的函数前,此时覆盖可以正常完成,但是具体调用父类的函数还是调用子类的函数,要看对象的类型。示例程序如下:
namespace demo
{
class Person
{
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
public void show()
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
}
static void Main(string[] args)
{
Person per = new Person("张三丰", 24);
per.show();
//Person stu = new
Student();//此时调用父类中的show方法
//Student stu = new Student();//此时调用子类中的show方法
stu.Department = "计算机";
stu.show();
}
}
class
Student:Person
{
string department;
public string Department
{
set
{
department = value;
}
get
{
return department;
}
}
public new void
show()
{
Console.WriteLine("系别:" + department);
}
}
}
(3)使用virtual,new或override
virtual用在父类的要被重写的函数前,new或override用在子类的重写父类的函数前。示例程序如下:
namespace demo
{
class Person
{
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
public virtual void
show()
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
}
static void Main(string[] args)
{
Person per = new Person("张三丰", 24);
per.show();
//Person stu = new
Student();//此时调用子类中的show方法
//Student stu = new Student();//此时调用子类中的show方法
stu.Department = "计算机";
stu.show();
}
}
class
Student:Person
{
string department;
public string Department
{
set
{
department = value;
}
get
{
return department;
}
}
public new void
show() //new也可以是用virtual。new时,调用父类show();override时,调用子类show()
{
Console.WriteLine("系别:" + department);
}
}
(4)总结如下
virtual函数允许子类函数重写该函数,override无论子类的实例是父类类型还是子类类型,子类的实例都会调用子类中重写的函数。new子类实例是子类类型,则调用子类中的重写函数;子类实例是父类类型,则调用父类中的重写函数。
父类中没有virtual修饰的函数也可以被子类中的new函数重写,但是此时子类的实例若是父类类型,调用的函数是父类的函数。