我找不到令人满意的解释。所以我认为在SO上发布这个会很有帮助。
当我们合并method hiding and overriding in C# ?
以下示例:
class BaseClassA
{
public virtual void showMessage()
{
Console.WriteLine("In BaseClass A ");
}
}
class DerivedClassB : BaseClassA
{
public override void showMessage()
{
Console.WriteLine("In DerivedClass B ");
}
}
class DerivedClassC : DerivedClassB
{
public new void showMessage()
{
Console.WriteLine("In DerivedClass C");
}
}
class Program
{
static void Main(string[] args)
{
BaseClassA a = new BaseClassA();
a.showMessage();
a = new DerivedClassB();
a.showMessage();
BaseClassA b = new DerivedClassC();
b.showMessage();
Console.ReadKey();
}
}
我理解
的输出 BaseClassA b = new DerivedClassC();
b.showMessage();
以下是我对C#中new
和override
的理解
New
- 它隐藏了基类方法。因此,即使baseclass引用变量指向派生类对象(如果该派生类隐藏了该方法),输出也只是基类输出。
Override
- 它覆盖了基类方法。因此,即使基类引用变量指向派生类对象,如果该派生类重写该方法,输出也将是派生类输出。
但是,即使BaseClassA
引用变量指向DerivedClassC
对象并打印DerivedClassB
的输出,该怎么办?
请用简单的词语解释。
答案 0 :(得分:2)
但是在这里,甚至BaseClassA引用变量如何指向DerivedClassC对象并打印DerivedClassB的输出?
代码调用由BaseClassA
声明但被DerivedClassB
覆盖的方法。在DerivedClassC
中声明的方法是一种新方法,与BaseClassA
中声明的方法完全分开......好像它在某种程度上有不同的名称。
有效地,这样想:
DerivedClassC
根本没有声明showMessage
方法,它会从DerivedClassB
继承实施,对吧?DerivedClassA
中引入的方法。因此输出与上一步相同。我认为将DerivedClassC
视为
class DerivedClassC : DerivedClassB
{
}
并理解 输出是了解后期行为的关键。