【问题标题】:Confused with override and new functionality C# [duplicate]对覆盖和新功能 C# 感到困惑 [重复]
【发布时间】:2013-04-19 12:25:02
【问题描述】:

Difference between Abstract and Virtual Function 了解抽象方法和虚拟方法之间的区别时。

我对@9​​87654323@ 和new 有疑问

让我们考虑如下示例代码

 class MainClass
 {
   public static void Main()
   {         
       DerivedClass _derived = new DerivedClass();          
       _derived.SayHello();          
       _derived.SayGoodbye();
       Console.ReadLine();
   }      
 }

public abstract class AbstractClass
{
   public void SayHello()
   {
       Console.WriteLine("Hello - abstract member\n");
   }

   public virtual void SayGoodbye()
   {
       Console.WriteLine("Goodbye- abstract member \n");
   }
   //public abstract void SayGoodbye();
}


public class DerivedClass : AbstractClass
{
   public new void SayHello()
   {
       Console.WriteLine("Hi There - Hiding base class member");
   }

   //public override void SayGoodbye()
   //{
   //    Console.WriteLine("See you later - In derived class OVERRIDE function");
   //}

   public new void SayGoodbye()
   {
       Console.WriteLine("See you later - In derived class I'm in  NEW  member");
   }           
}

我的问题: 在派生类中,如果我调用 SayGoodbye 函数,overridenew 如何执行相同的功能?我什么时候需要去选择/喜欢它们?我需要在哪些实时场景中更喜欢?

【问题讨论】:

  • 问题/答案@Oded 链接可完美回答您的问题。
  • 用上面的代码试试这个:Console.WriteLine((AbstractClass)_derived.SayGoodbye());。它将执行基类方法。如果您已覆盖而不是隐藏,则不会发生这种情况。

标签: c# .net oop .net-4.5


【解决方案1】:
  • 当您将类成员标记为virtual 时,它可以在子类中被覆盖。
  • 如果您想更改子类中的方法(在基类中声明为 virtual),您可以同时使用 newoverride 关键字,但它们之间存在区别

    使用new时:如果将子类的对象转换为基类,然后调用该方法,基类实现将运行

    使用覆盖时:如果将子类的对象强制转换为基类,然后调用该方法,子类实现就会运行。

这里是代码

AbstractClass instance = new DerivedClass();
instance.SayGoodbye();  //See you later - In derived class I'm in  NEW  member

但是如果你使用override

AbstractClass instance = new DerivedClass();
instance.SayGoodbye();  //Goodbye- abstract member \n

【讨论】:

  • 如果不将子类的对象转换为基类?那么会有什么不同吗?
  • @sukumar 在这种情况下不确定答案,您可以搜索它或将其作为不同的问题提出。
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2018-08-15
  • 2022-01-04
  • 2013-08-21
相关资源
最近更新 更多