virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。如果没有此关键字,则不允许在子类中重写此方法。
override 关键字,用于重写父类中的时使用,重写之后则在子类中完全覆盖父类中的方法。
new 关键字,用户重新书写一个与父类中相同的方法,不会覆盖父类中的方法,只会隐藏。
用两个例子来说明:
例子1:
A a = new B();
a.Fun();
public class A
{
public A()
{
Console.WriteLine("a");
}
public virtual void Fun()
{
Console.WriteLine("a.fun()");
}
}
public class B : A
{
public B()
{
Console.WriteLine("b");
}
public override void Fun()
{
Console.WriteLine("b.fun()");
}
}
输出:a b b.fun()
例子2:
A a = new B();
a.Fun();
public class A
{
public A()
{
Console.WriteLine("a");
}
public virtual void Fun()
{
Console.WriteLine("a.fun()");
}
}
public class B : A
{
public B()
{
Console.WriteLine("b");
}
public new void Fun()
{
Console.WriteLine("b.fun()");
}
}
输出 a b a.fun();
解释:实例1,方法fun()在B子类中被重载,那么在B子类中就看不到A父类中继承的方法fun(),所以B对象调用的是自己重写的方法;实例2,方法fun()在B子类中被重新写了一遍,相当于一个新方法(只是名字与父类中的方法名字相同而已,但该方法和父类中没有关联),于A父类没有任何联系,而A父类中继承的方法fun()则被隐藏了,把B的对象赋值给A(由于在A类中没有重新写过的方法的定义以及实现,所以在把B对象赋值给A时会去掉某些方法),这时A调用fun()则是调用了继承于父类的方法,只有使用B对象自己调用才会是重写编写过的方法
如果在子类中重载了一个父类的方法,则会发生什么情况了,我们来看个例子:
public class A
{
public A()
{
Console.WriteLine("a");
}
public virtual void Fun(int i)
{
Console.WriteLine("a.fun()" + i.ToString());
}
}
public class B : A
{
public B()
{
Console.WriteLine("b");
}
public override void Fun(int i)
{
Console.WriteLine("b.fun()" + i.ToString());
}
public void Fun(float s)
{
Console.WriteLine("s = " + s.ToString());
}
}
在这种情况下,调用B类中的方法Fun(),并传入参数1,则会输出 s = 1,这是因为int型的参数可以转换成float,double,decimal类型,程序就会找B类重写的方法,如果B类重写的方法参数为string类型,则不会出现这种情况,如果需要调用子类重写的父类方法,则使用父类的类名强制转换声明的对象进行调用。
本人第一次写博客,请谅解,如有错误希望能够告知