多态
按照对多态“同样的操作,得到不同的结果”的观点,重载(overload)和覆盖(override)都是实现多态的手段。其中,重载是静态多态实现,在程序编译时实现;覆盖是动态多态实现,在程序运行时实现。
重载
重载(Overload),指的是在同一个类中,同名但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。
发生条件:
① 在同一个类中。
② 方法名相同。
③ 方法参数类型或者个数不同。
代码示例:
public class Name
{
public static string GetName(string username)
{
return username;
}
public static int GetName(int usercount)
{
return usercount;
}
}
覆盖
覆盖(New)指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。
发生条件:
① 必须存在继承关系。
② 方法名与父类的方法名一致的非虚函数。
③ 编译后会提示要求使用New关键字。
代码示例:
public class Animal
{
public void Eat()
{
Console.WriteLine("动物吃东西");
}
}
public class Cat : Animal
{
public new void Eat()
{
Console.WriteLine("猫要吃鱼");
}
}
public class NorthCat : Cat
{
public new void Eat()
{
Console.WriteLine("东北猫爱吃日本鱼");
}
}
重写
重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或override标注的,不能重写非虚方法或静态方法。
发生条件:
① 必须存在继承关系。
② 方法名和参数列表必须与父类的方法保持一致。
③ 父类用Vritual修饰方法。
④ 子类用Override重写父类的方法。
代码示例:
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("动物吃东西");
}
}
public class Cat : Animal
{
public int a = 2;
public override void Eat()
{
Console.WriteLine("猫要吃鱼");
}
}
public class NorthCat : Cat
{
public override void Eat()
{
Console.WriteLine("东北猫爱吃日本鱼");
}
}
小结
重写(Override)的两个函数的函数特征相同,应用在子类和父类中,会重写父类函数;
重载(Overload)的两个函数的函数名虽然相同,但函数特征不同,应用在同一类中;
覆盖(new)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。
参考资料: