将派生类作为基类
假设我有这个:
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关键字覆盖的方法将执行该实现在基类中执行实现。
上述示例中的变量bc
如何转换为基类?
我知道new关键字将覆盖派生类中的方法实现,并且它将在派生类的实例变量用于调用重写的方法时执行,但我不知道它是何种类型的转换。似乎不是隐式也不是明确的,可能是类型转换,但我对语法感到困惑。
任何解释赞赏。
我知道new关键字将覆盖派生类中的方法实现
不会 。它不覆盖基类的方法。 它声明了一个新的独立方法,它的名称相同并具有相同的签名。 其效果是隐藏了在基类中声明的同一签名方法,这有效地复杂了基类中声明的同一签名方法的调用。
在你的例子中,没有任何“类型转换”。 将类型转换为提供实例的特定视图 - 将类的合约的特定部分暴露给用户。 没有什么比这更简单了。
例:
// 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如何转换为基类?
当您将新的DerivedClass
实例分配给BaseClass
类型的变量时,将执行隐式转换:
BaseClass bc = new DerivedClass();
实际上,没有转换。 只有你看这个物体的方式。