在Difference between Abstract and Virtual Function处查看抽象和虚拟方法之间的差异时。
我怀疑与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
如何执行相同的功能?当我需要选择/喜欢他们?我需要在哪些实时场景中使用它们?
答案 0 :(得分:2)
virtual
时,可以在子班级中将其覆盖。如果您想要更改子类中的方法(在基类中声明为虚拟),您可以同时使用new
和override
关键字,但它们之间存在差异
。 使用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