C#基础(三)—重载与覆盖

所谓重载指的是同一个类中有两个或多个名字相同可是参数不一样的方法。重载,必然发生在一个类中,函数名相同,参数类型或者顺序不一样构成重载,与返回类型无关。ide

override:过载也称重写是指子类对父类中虚函数或抽象函数的“覆盖”(这也就是有些书将过载翻译为覆盖的缘由),可是这种“覆盖”和用new关键字来覆盖是有区别的。
new:覆盖指的是不一样类中(基类或派生类)有两个或多个返回类型、方法名、参数都相同,可是方法体不一样的方法。
可是这种覆盖是一种表面上的覆盖,因此也叫隐藏,被覆盖的父类方法是能够调用获得的。
重载覆盖的发生条件:
重载,必然发生在一个类中,函数名相同,参数类型或者顺序不一样构成重载,与返回类型无关
重写,必然发生在基类和派生类中,其类函数用virtual修饰,派生类用override修饰
覆盖,在子类中写一个和基类同样名字(参数不一样也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字
重载示例:函数

public void Fun()
{
Console.WriteLine("I am F");
}
public void Fun(int i)
{
Console.WriteLine("I am F,i={0}",i);
}
override重写特性:
由 override 声明重写的方法称为重写基方法,重写的基方法必须与 override 方法具备相同的签名。
重写的基方法必须是 virtual、abstract 或 override 的,不能重写非虚方法或静态方法
override的方法和virtual的方法必须具备相同的访问级别修饰符,不能更改 virtual 方法的可访问性
不能使用new、static 或 virtual 修饰符来修改 override 方法。
重写属性声明必须指定与继承属性彻底相同的访问修饰符、类型和名称,而且被重写的属性必须是virtual、abstract 或 override 的。
覆盖示例:
当咱们没有使用覆盖时,派生类继承基类,结果以下:
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//结果为:I am F
当咱们覆盖原来的方法呢?
 class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public new void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//结果为:I am F,i=1
new覆盖与重写、重载的区别:
当子类与父类的参数不一样时
当基类函数不是虚函数时,基类函数将被隐藏。(由于子类和基类不在同一范围内,因此不是重载)
当基类函数是虚函数时,基类函数将被隐藏。(由于子类和基类不在同一范围内,因此不是重载;由于参数不一样,因此不是重写)
当子类与父类的参数相同时
当基类函数不是虚函数时,基类函数将被隐藏。(由于子类和基类不在同一范围内,因此不是重载,由于基类不是虚函数,因此是隐藏不是重写)
当基类函数是虚函数时,基类函数将被覆盖。(由于子类和基类不在同一范围内,因此不是重载)
那么为何不是重写呢?咱们能够作一个例子还测试一下,这个例子在虚函数时已经举过,在这里为了说明此问题在重复一下:
 class A
{
public virtual void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public override void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
A p = new Program();
p.Fun();
Console.Read();
}
}
复制代码咱们知道,以上例子中,派生类存在一个对基类的重写方法,因此结果为:I am F ,i=1 如果咱们把override换成new,那么若是是重写的话,会和上面的结果相等,但实际结果是什么呢? 实际的结果是:I am F 由此咱们知道,当基类函数是虚函数时,基类函数不是重写,而是覆盖了基函数的同名函数。