标签:virtual 方法 类型 转型 子类 警告 c# bcd 隐藏
先放出来两个基类和派生类:
public class BaseClass { public virtual void Method1(string desc) { Console.WriteLine(desc + ": Base - Method1"); } public void Method2(string desc) { Console.WriteLine(desc + ": Base - Method2"); } } public class DerivedClass : BaseClass { public override void Method1(string desc) { Console.WriteLine(desc + ": Derived - Method1"); } public new void Method2(string desc) { Console.WriteLine(desc + ": Derived - Method2"); } }
new除了可以创建对象和作为泛型约束之外,还可以作为方法的修饰符,这里讨论的是作为方法的修饰符时与override的异同:
两者该怎么用呢?且看上面两个父子类。DerivedClass继承了BaseClass,Method1重写了基类的,Method2隐藏了基类的。
单纯地var bc = new BaseClass();或var dc = new DerivedClass();调用的是各自的方法,这点不用讨论了。当BaseClass bcdc = new DerivedClass();时,这里发生了一次向上转型,bcdc从DerivedClass转型为其上级(基类)BaseClass类型;实例bcdc.Method1调用的将是DerivedClass的方法,因为在实例化的时候Method1已经被重写(override)过了;而bcdc.Method2调用的将是BaseClass的方法,因为Method2没有被动到,依然是BaseClass原来的方法。
总结起来就是:在派生类中,相同签名的方法基类的也要重写(影响到)的话就是用override,只想派生类实现给自己的话(不影响基类)就用new。这样实例向上转型后override的会被保留(因为已经被派生类重写),new的会使用基类原来的方法。
标签:virtual 方法 类型 转型 子类 警告 c# bcd 隐藏
原文地址:http://www.cnblogs.com/huangsheng/p/when-to-use-override-new-in-csharp.html