override和new关键词的差别
继承和多态是我们常用的面向对象的特性,其中override和new关键词是我们最经常用到的,用下面的例子解释其用法。
假设我们我们有基类BaseClass和ChildClass,都有方法DoSomething。
在调用端使用下面的测试代码:
ChildClass cc = new ChildClass();
BaseClass bs = cc;
Console.Write(bs.DoSomething());
在基类和子类的DoSomething方法上的不同标记会对执行产生不同的影响。
override一般翻译成“覆盖”或“重写”,其完整的说法应该是子类中的方法覆盖基类中的方法;
new翻译成“隐藏”,其完整的说法应该是基类的方法隐藏子类中的方法。
下面描述标记不同,调用效果的不同。
a、如果基类和子类都没有特殊标记,按照“new”来处理,用基类引用指向子类对象,调用的是基类的方法;
b、如果基类未标记,子类标记为new,效果同a;
c、如果基类标记为virtual,子类未标记,效果还是同a;
d、如果基类标记virtual,子类标记为override,即为“覆盖”处理,用基类引用指向子类,调用的是子类的方法;
e、如果基类标记为virtual,子类标记为new,效果还是同a。
需要注意的是a和c会出现警告,提醒程序员使用清晰的写法。d和e是推荐的写法,明确的表明了用意。
对于b,即使基类中没有DoSomething方法,使用new标记也没有任何问题。但如果基类没有标记virtual,子类标记为override,则会出现编译时的错误。
假设我们我们有基类BaseClass和ChildClass,都有方法DoSomething。
在调用端使用下面的测试代码:
ChildClass cc = new ChildClass();
BaseClass bs = cc;
Console.Write(bs.DoSomething());
在基类和子类的DoSomething方法上的不同标记会对执行产生不同的影响。
override一般翻译成“覆盖”或“重写”,其完整的说法应该是子类中的方法覆盖基类中的方法;
new翻译成“隐藏”,其完整的说法应该是基类的方法隐藏子类中的方法。
下面描述标记不同,调用效果的不同。
a、如果基类和子类都没有特殊标记,按照“new”来处理,用基类引用指向子类对象,调用的是基类的方法;
b、如果基类未标记,子类标记为new,效果同a;
c、如果基类标记为virtual,子类未标记,效果还是同a;
d、如果基类标记virtual,子类标记为override,即为“覆盖”处理,用基类引用指向子类,调用的是子类的方法;
e、如果基类标记为virtual,子类标记为new,效果还是同a。
需要注意的是a和c会出现警告,提醒程序员使用清晰的写法。d和e是推荐的写法,明确的表明了用意。
对于b,即使基类中没有DoSomething方法,使用new标记也没有任何问题。但如果基类没有标记virtual,子类标记为override,则会出现编译时的错误。