假设我有这个:
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 关键字将覆盖派生类中的方法实现,并且当派生类的实例变量用于调用重写方法时它将被执行,但我似乎不是隐式也不是显式,可能是键入转换但我对语法感到困惑 .
任何解释都表示赞赏 .
4 回答
不,它 does not 覆盖了基类的方法 . 它声明了一个新的,独立的方法,它只是命名相同并具有相同的签名 . 其结果是隐藏了基类中声明的相同签名方法,有效地复制了在基类中声明的相同签名方法的调用 .
在你的例子中,没有任何'type conversions' . 将类型转换视为提供实例的特定视图 - 仅仅暴露类的特定部分's contract to the user. It' s,仅此而已 .
例:
实际上,没有转换 . 只有你看待对象的方式 .
如果你用基类眼镜来看它,你会看到所有的基类方法,包括来自派生类的重写方法1,但是它不会包含派生类中的新方法2,所以你只会请参阅基类中的Method2 .
如果你使用derived-class-glasses来看它,你会看到所有的基类方法,其中包括来自派生类的重写的Method1,但它现在将 also 包含派生类中的新Method2 . 基类中的原始虚拟Method1将不可见 .
它是一个隐式转换,当您将新的
DerivedClass
实例分配给BaseClass
类型的变量时执行:啊,我刚刚找到了this,而我说它没有过度阅读这个问题我错了 .