【问题标题】:Derived class's print isn't called, why? [duplicate]派生类的 print 没有被调用,为什么? [复制]
【发布时间】:2017-10-15 18:15:46
【问题描述】:

我有这个代码。我不明白为什么派生类的 print 没有被调用。我相信这是因为“新”。我不确定它的功能。

using System;
class BaseClass
{
  public void Print()
  {
     System.Console.WriteLine("BaseClass");
  }
}

class DerivedClass : BaseClass
{
  new public void Print()
  {
     System.Console.WriteLine("DerivedClass");
  }
}

class Program
{
  public static void Main()
  {
     BaseClass b;
     b = new BaseClass();
     b.Print();   

     b = new DerivedClass();
     b.Print();    
  }
}

【问题讨论】:

    标签: c# code-snippets


    【解决方案1】:

    因为Print 方法不是虚拟的,并且您使用new 关键字将其明确标记为完全独立于基类。将方法更改为 virtual 并在派生类中覆盖它:

    class BaseClass
    {
      public virtual void Print()
      {
         System.Console.WriteLine("BaseClass");
      }
    }
    
    class DerivedClass : BaseClass
    {
      public override void Print()
      {
         System.Console.WriteLine("DerivedClass");
      }
    }
    

    【讨论】:

    • 我明白了,因为在 java 中它可以工作(默认情况下所有函数都是虚拟的)。 C# 在这方面有点不同。谢谢德米特里!
    • 顺便说一句,在你的例子中,如果我写'new'而不是覆盖,它只会隐藏基类中的打印函数,因此它将调用基类的打印并将其从派生类中隐藏.
    【解决方案2】:

    是的,因为你的 b 是 BaseClass Type 并且你没有 virtual 函数 Print 并且你没有你不能 override 它在 DerivedClass 中并且将被称为 @987654327 @Print().

    【讨论】:

    • 我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2018-02-03
    • 2011-01-02
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多