1

在“抽象与虚函数的区别”中了解抽象与虚方法之间的区别。

我有一个与virtual和有关的疑问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");
   }           
}

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

4

1 回答 1

2
  • 当您将类成员标记为virtual可以在子类中覆盖时。
  • 如果要更改子类中的方法(在基类中声明为 virtual),可以同时使用newandoverride关键字,但它们之间存在差异

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

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

这是代码

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
于 2013-04-19T12:31:52.587 回答