写在前面,在C#中派生类实例化时,首先会调用基类的构造方法,然后再调用派生类的构造方法。在C#中可以在派生类中对基类中使用virtual、override、abstract声明的方法进行重写(override)。同样也可以在派生类中使用new 关键字对基类相应的方法进行覆盖。那么这两种方式究竟有多大区别呢?下面开始试验.....
一、范围
// 基类A
public class A
{
//虚方法
public virtual void A_Method()
{
Console.WriteLine("这是基类A的方法!");
}
}
在派生类B中对基类虚方法A进行重写(override)和覆盖(new)
1.改变方法主体
override(可以使用)
public override void Print()
{
Console.WriteLine("这是派生类B对基类方法的重写!");
}
new(可以使用)
public new void Print()
{
Console.WriteLine("这是派生类B对基类方法的覆盖!");
}
2.改变方法返回值
override(不可使用,提示返回类型要与基类成员匹配)
public override string Print()
{
Console.WriteLine("这是派生类B对基类方法的重写!");
return "STR";
}
new(可以使用)
public new string Print()
{
Console.WriteLine("这是派生类B对基类方法的覆盖!");
return "STR";
}
3.添加参数
override(不可使用,提示没有找到适合的方法来重写)
public override void Print(int a)
{
Console.WriteLine("这是派生类B对基类方法的重写!");
}
new(可以使用,但是会产生一个警告,提示不会隐藏可访问成员,不需要关键字new)
public new void Print(int A)
{
Console.WriteLine("这是派生类B对基类方法的覆盖!");
}
这里我们做一个测试,看看这个警告是什么意思
// 基类A
public class A
{
//A的构造方法
public A()
{
Console.WriteLine("这是基类A的构造方法!");
this.Print(); //打印
}
//虚方法
public virtual