困惑的覆盖和新功能C#

时间:2013-04-19 12:25:03

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

Difference between Abstract and Virtual Function处查看抽象和虚拟方法之间的差异时。

我怀疑与virtualnew

有关

我们考虑下面的示例代码

 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");
   }           
}

我的问题: 在派生类中,如果我调用override函数,newSayGoodbye如何执行相同的功能?当我需要选择/喜欢他们?我需要在哪些实时场景中使用它们?

1 个答案:

答案 0 :(得分:2)

  • 当您将班级成员标记为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