假设我有这个:
using System; public class Program { public static void Main() { BaseClass bc = new DerivedClass(); bc.Method1(); bc.Method2(); Console.WriteLine(bc.GetType().FullName); // Output // Derived - Method1 (override) // Base - Method2 // DerivedClass } } public class BaseClass { public virtual void Method1() { Console.WriteLine("Base - Method1"); } public virtual void Method2() { Console.WriteLine("Base - Method2"); } } public class DerivedClass : BaseClass { public override void Method1() { Console.WriteLine("Derived - Method1 (override)"); } public new void Method2() { Console.WriteLine("Derived - Method2 (new)"); } }
如果派生类的实例变量强制转换为基类,并且该实例变量用于调用重写的方法,则用override关键字重写的方法将执行派生类中的实现,而用new关键字重写的方法将执行基类中的实现。
上面示例中的变量
我知道new关键字将重写派生类中的方法实现,并且当使用派生类的一个实例变量调用重写的方法时它将被执行,但我不知道它是什么类型的转换?。似乎不是隐式的也不是显式的,可能是类型转换,但我被语法弄糊涂了。
如有任何解释,不胜感激。
我知道new关键字将覆盖派生类中的方法实现
不。它不重写基类的方法。它声明了一个新的,独立的方法,命名相同,签名相同。其效果是隐藏了基类中声明的same-signature方法,有效地使基类中声明的same-signature方法的调用复杂化。
在您的示例中,没有任何“类型转换”。将类型强制转换视为提供实例的特定视图,向用户公开类契约的特定部分。不多也不少。
示例:
// instance of DerivedClass exposing its full contract via the 'dc' variable
DerivedClass dc = new DerivedClass();
// the same instance of DerivedClass exposing its contract limited to what's declared in BaseClass
BaseClass bc = dc;
// calling Method2 as newly declared in DerivedClass
dc.Method2();
// calling Method2 as declared in BaseClass—the following two lines are equivalent
bc.Method2();
((BaseClass)dc).Method2();
实际地说,没有转换。只有你看物体的方式。
上面示例中的变量bc是如何强制转换到基类的?
它是将新的
BaseClass bc = new DerivedClass();