覆盖(new),重写(Override)和重载(Overload)
覆盖:new关键词修饰方法,保留父类方法
重写:override关键词修饰方法,不保留父类方法
覆载:同一个类中,方法名相同,参数不同
覆盖(new)
覆盖(new)指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。在子类中用new 关键字修饰,定义的与父类中同名的方法。覆盖不会改变父类方法的功能。
class Program
{
static void Main(string[] args)
{
B1 b1 = new B1();
Console.WriteLine(b1.GetName()); //输出内容为“中文名”
B2 b2 = new B2();
Console.WriteLine(b2.GetName()); //输出内容为“yingwenming”
//下半部分内容与上半部分进行对比
B1 b3 = new B2();
Console.WriteLine(b3.GetName()); //输出内容为“中文名”
}
}
public class B1
{
public string GetName()
{
return "中文名";
}
}
public class B2 : B1
{
public new string GetName()
{
return "yingwenming";
}
}
重写(Override)
重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或 override标注的,不能重写非虚方法或静态方法。
Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类的函数了,它被覆盖掉了。
用关键字virtual修饰的方法,叫虚方法。虚方法是多态的一种体现。相应的没有用virtual修饰的方法,叫实方法。可以在子类中用override声明同名的方法,这个叫“重写”。“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。重写是重写基类的方法,把父类中的方法变成我们更需要的。重写会改变父类中的方法功能。
class Program
{
static void Main(string[] args)
{
A1 a1 = new A1();
Console.WriteLine(a1.GetName()); //输出内容为“中文名”
A2 a2 = new A2();
Console.WriteLine(a2.GetName()); //输出内容为“yingwenming”
//该例子注意和下面的例子进行对比
A1 a3 = new A2();
Console.WriteLine(a3.GetName()); //输出内容为“yingwenming”
}
}
public class A1
{
public virtual string GetName()
{
return "中文名";
}
}
public class A2 : A1
{
public override string GetName()
{
return "yingwenming";
}
}
重载(Overload)
overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字。返回值可能不同,可能相同。

浙公网安备 33010602011771号