Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中方法隐藏和方法重写的结合#_C#_.net_Overriding_Method Hiding - Fatal编程技术网

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

我就是找不到一个令人满意的解释。所以我想把这篇文章发到某处会有帮助

当我们在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
-它隐藏基类方法。因此,即使基类引用变量指向派生类对象(如果该派生类隐藏该方法),输出也将仅为基类输出

覆盖
-它覆盖基类方法。因此,即使基类引用变量指向派生类对象(如果该派生类重写该方法),输出也将是派生类输出

但是在这里,即使是
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
的表达式调用方法。它不知道您的新方法,并且您明确表示您不会覆盖现有方法。。。因此,就调用而言,该方法基本上不存在。