C# C语言中方法隐藏和方法重写的结合#
我就是找不到一个令人满意的解释。所以我想把这篇文章发到某处会有帮助 当我们在C#中结合C# C语言中方法隐藏和方法重写的结合#,c#,.net,overriding,method-hiding,C#,.net,Overriding,Method Hiding,我就是找不到一个令人满意的解释。所以我想把这篇文章发到某处会有帮助 当我们在C#中结合方法隐藏和重写时会发生什么? 对于以下示例: class BaseClassA { public virtual void showMessage() { Console.WriteLine("In BaseClass A "); } } class DerivedClassB : BaseClassA { public override void showMes
方法隐藏和重写时会发生什么?
对于以下示例:
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
-它隐藏基类方法。因此,即使基类引用变量指向派生类对象(如果该派生类隐藏该方法),输出也将仅为基类输出
覆盖
-它覆盖基类方法。因此,即使基类引用变量指向派生类对象(如果该派生类重写该方法),输出也将是派生类输出
但是在这里,即使是BaseClassA
引用变量也如何指向DerivedClassC
对象并打印DerivedClassB
的输出
请用简单的话解释
但在这里,BaseClassA引用变量如何指向DerivedClassC对象并打印DerivedClassB的输出
代码调用由BaseClassA
声明但被DerivedClassB
覆盖的方法。DerivedClassC
中声明的方法是一种新方法,完全独立于BaseClassA
中声明的方法。。。在某种程度上,好像它有一个不同的名字
实际上,可以这样想:
- 如果
根本没有声明一个DerivedClassC
方法,它将从showMessage
继承实现,对吗DerivedClassB
- 引入新方法不会更改输出,因为它是一个单独的方法,不涉及重写
中引入的方法。因此,输出与上一步相同DerivedClassA
DerivedClassC
就像
class DerivedClassC : DerivedClassB
{
}
理解输出是理解后续行为的关键。感谢您的及时响应。但是我没有得到这个部分。。。为什么我认为DerivedClassC没有声明
showMessage()
?是的,它将从DerivedClassB
继承实现,但它将从BaseClassA
继承。因此,DerivedClassC
是否会隐藏BaseClassA
的方法?我是不是想错了?@StruglingCoder:是的,DerivedClassC
对BaseClassA
隐藏了方法,但是您没有对类型为DerivedClassC
的变量调用该方法。如果您有DerivedClassC=new-DerivedClassC();c、 showMessage()代码>然后你会看到“在C类中”。这正是我的困惑。为什么我不称之为隐藏方法?如果DerivedClassC:BaseClassA
然后BaseClassA=new-DerviedClassC
,那么我肯定会看到要打印的BaseClassA中的。但是为什么不在这里呢?仅仅因为DerivedClassC:DerivedClassB
但是DerivedClassB:BaseClass A对吗?
我遗漏了什么吗?@StruglingCoder:你调用它并不是因为它是“新的”—它不会覆盖之前声明的方法。您正在对编译时类型为BaseClassA
的表达式调用方法。它不知道您的新方法,并且您明确表示您不会覆盖现有方法。。。因此,就调用而言,该方法基本上不存在。