new和override
1,override:重写 :只有当基类声明有虚函数时派生类才用来重写虚函数,实现多态的一部分
2,new:表示派生类写一个新的函数,不管是否与基类函数是否相同,当与基类函数相同时将隐藏基类同名函数,与多态无关
3,派生类:重载或重写(没标注override)基类同名函数时都将隐藏基类同名函数,与多态无关
4,当派生类override基类函数时,实现基类在引用派生类时的多态性,当派生类对象调用override函数时,若派生类中有与override函数同名的将调用同名函数而不调用override函数
代码区:
情况一:
public class Animal{
public Animal(){
Console.WriteLine ("Animal()");
}
public virtual void say(){
Console.WriteLine ("Animal say");
}
}
class Dog:Animal{
public Dog():base(){
Console.WriteLine ("Dog()");
}
public new void say(int x=0){
Console.WriteLine ("Dog say new");
}
public override void say(){
Console.WriteLine ("Dog say override");
}
//下面两个函数与public new void say(int x=0)函数产生二义性,
// public void say(int x=0){
// Console.WriteLine ("Dog say new");
// }
// public void say(){
// Console.WriteLine ("Dog say new");
// }
}
public static void Main (string[] args)
{
Animal a=new Animal();
Dog d = new Dog ();
a = d;
a.say ();
d.say ();
}
结果:
Animal()
Animal()
Dog()
Dog say override
Dog say new X:0
情况二:
public class Animal{
public Animal(){
Console.WriteLine ("Animal()");
}
public virtual void say(){
Console.WriteLine ("Animal say");
}
}
class Dog:Animal{
public Dog():base(){
Console.WriteLine ("Dog()");
}
public new void say(){
Console.WriteLine ("Dog say new ");
}
//与public new void say()函数产生二义性,即override和new不能重写同一个函数
// public override void say(){
// Console.WriteLine ("Dog say override");
// }
//
public void say(int x=0){
Console.WriteLine ("Dog say new X:{0}",x);
}
//与public new void say()函数产生二义性,
// public void say(){
// Console.WriteLine ("Dog say new");
// }
}
public static void Main (string[] args)
{
Animal a=new Animal();
Dog d = new Dog ();
a = d;
a.say ();
d.say ();
d.say (3);
}
结果:
Animal()
Animal()
Dog()
Animal say
Dog say new
Dog say new X:3