先看如下实例代码:
class Base //父类
{
public virtual void F1()
{
Console.WriteLine("Base's virtual function F1");
}
public virtual void F2()
{
Console.WriteLine("Base's virtual fucntion F2");
}
}
class Derived:Base //子类继承父类
{
public override void F1()
{
Console.WriteLine("Derived's override function F1");
}
public new void F2()
{
Console.WriteLine("Derived's new function F2");
}
}
class Program
{
public static void Main(string[] args)
{
Base b1 = new Derived();
//由于子类覆盖了父类的方法,因此这里调用的是子类的F1方法。也是OO中多态的体现
b1.F1();
//由于在子类中用new隐藏了父类的方法,因此这里是调用了隐藏的父类方法
b1.F2();
}
}
输出结果:
Derived's override function F1
Base's virtual function F2
-
override
即覆盖重写的意思,指子类继承父类后,重写并覆盖了父类的某个方法,子类对象无法再访问父类中的该方法。
如上例子:
Base b1 = new Derived();
意思为创建了一个父类Base类的引用b1,使其指向子类Derived类的一个对象,此时b1可以调用Base类中的除被Derived类重写的方法或属性之外的所有的属性和方法以及Derived类中被Derived类重写的方法和属性
因此b1.F1()
调用的是子类Derived类中的F1方法,因为子类Derived类中重写了F1方法。 -
new
即隐藏的意思,是指子类显式的隐藏了父类的方法,new在此时是被用作声明修饰符,一般用于当子类需要使用父类中的方法或属性,但是其方法内容和值又不相同,此时,不用更改父类中的方法和属性,只需在子类中创建同名的方法和属性,并在前面加上声明修饰符new即可,这样当子类对象调用此方法或属性时,就调用的是子类中的方法或属性,因为加new之后,子类中的方法或属性相当于显式的隐藏了父类中的同名方法和属性。
但加new仅仅只是隐藏了父类中的方法或属性而已
Base b1 = new Derived();
此时b1.F2()
调用的就是父类中的F2方法,因为子类Derived类并没有重写父类中的F2方法,只是将其隐藏掉了,这样,指向子类对象的父类引用是无法调用没有被子类重写的方法或属性,所以,b1.F2()
自然就调用的是父类中的F2方法
如果Derived b1 = new Derived();
则此时的b1.F2
调用的就是子类Derived中的F2方法,还是因为其将父类中的F2方法隐藏掉了。
总结:
用override和new最大的分别就是
用override时:当子类中重写了父类中的一个方法或属性,指向子类对象的父类引用调用的就是子类中的此方法或属性,而无法调用父类中的此方法或属性。要调用父类中的此方法或属性,只能通过父类对象的父类引用。当然,子类对象的子类引用此时调用的也是被子类重写的方法或属性。
用new时:当子类中new了父类中的一个方法或属性,指向子类对象的父类引用调用的就是父类中的此方法或属性,而无法调用子类中的此方法和属性,当然父类对象的父类引用调用的也是父类中的此方法或属性。要调用子类中new过的此方法或属性,只能通过子类对象的子类引用来调用。
网友评论