在 C# 中结合方法隐藏和方法覆盖
Combining Method hiding and method overriding in C#
对此我找不到满意的解释。所以我认为这对 post 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 方法。因此,即使 baseclass 引用变量指向派生的 class 对象,如果派生的 class 隐藏了该方法,输出将仅为 baseclass 输出。
Override
- 它覆盖了 baseclass 方法。因此,即使 baseclass 引用变量指向派生 class 对象,如果派生 class 重写该方法,输出将派生 class output.
但是在这里,甚至 BaseClassA
引用变量如何指向 DerivedClassC
对象并打印 DerivedClassB
的输出?
请简单说明。
But here how can even a BaseClassA reference variable point to DerivedClassC object and it prints DerivedClassB's output ?
代码调用由 BaseClassA
声明但被 DerivedClassB
覆盖的方法。 DerivedClassC
中声明的方法是一种新方法,与 BaseClassA
中声明的方法完全不同......就好像它在某种程度上具有不同的名称。
有效地,这样想:
- 如果
DerivedClassC
根本没有声明showMessage
方法,它会继承DerivedClassB
的实现,对吗?
- 引入 new 方法不会更改输出,因为它是一个单独的方法,不涉及覆盖
DerivedClassA
中引入的方法。所以输出与上一步相同。
我认为 DerivedClassC
只是
class DerivedClassC : DerivedClassB
{
}
并理解 输出是理解后续行为的关键。
对此我找不到满意的解释。所以我认为这对 post 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 方法。因此,即使 baseclass 引用变量指向派生的 class 对象,如果派生的 class 隐藏了该方法,输出将仅为 baseclass 输出。
Override
- 它覆盖了 baseclass 方法。因此,即使 baseclass 引用变量指向派生 class 对象,如果派生 class 重写该方法,输出将派生 class output.
但是在这里,甚至 BaseClassA
引用变量如何指向 DerivedClassC
对象并打印 DerivedClassB
的输出?
请简单说明。
But here how can even a BaseClassA reference variable point to DerivedClassC object and it prints DerivedClassB's output ?
代码调用由 BaseClassA
声明但被 DerivedClassB
覆盖的方法。 DerivedClassC
中声明的方法是一种新方法,与 BaseClassA
中声明的方法完全不同......就好像它在某种程度上具有不同的名称。
有效地,这样想:
- 如果
DerivedClassC
根本没有声明showMessage
方法,它会继承DerivedClassB
的实现,对吗? - 引入 new 方法不会更改输出,因为它是一个单独的方法,不涉及覆盖
DerivedClassA
中引入的方法。所以输出与上一步相同。
我认为 DerivedClassC
只是
class DerivedClassC : DerivedClassB
{
}
并理解 输出是理解后续行为的关键。