引言: 在面向对象编程中,Virtual、New和Override是三个重要的关键字。它们在继承、多态和方法重写等方面起到了关键作用。本博客将深入探讨这些关键字的含义、用法和作用,以帮助读者更好地理解它们在编程中的作用:
- Virtual关键字: Virtual关键字用于指示方法可以在派生类中被重写。使用virtual关键字,我们可以在基类中定义虚拟方法,并在派生类中根据需要进行重写。虚拟方法通过基类的引用或指针调用时,实际上会调用派生类中重写的方法。这种技术称为动态绑定,它实现了运行时多态性。通过虚拟方法,我们可以通过基类类型调用派生类的方法,提供了更大的灵活性和可扩展性。
- New关键字: New关键字用于隐藏基类中的成员,并在派生类中重新定义。当我们在派生类中使用new关键字重新定义一个成员时,该成员会隐藏基类中的同名成员。这种技术称为隐藏方法。使用new关键字的隐藏方法将在基类和派生类之间创建两个独立的成员。当我们通过基类的引用或指针调用该成员时,会调用基类的方法。而当我们通过派生类的引用或指针调用该成员时,会调用派生类的方法。这种技术允许我们在派生类中对基类的成员进行修改、扩展或特化。
- Override关键字: Override关键字用于在派生类中重写基类中的虚拟方法。使用override关键字,我们可以在派生类中对基类中的虚拟方法进行重写。派生类中重写的方法将完全替代基类中的方法,并且在运行时通过基类的引用或指针调用时,会调用派生类中重写的方法。通过方法重写,我们可以在派生类中提供更具体、更适应当前需求的实现。这种技术实现了运行时多态性,允许我们在派生类中自定义虚拟方法的行为。
- 关系和区别:
- 标记为Virtual的方法可以在派生类中重写,实现多态性;标记为New的方法隐藏基类中的成员,而不是重写。
- 使用Override关键字可以通过基类引用调用派生类中的重写方法;使用New关键字无法通过基类引用调用派生类中的隐藏方法。
- Override关键字触发运行时多态性,而New关键字不会。
5.使用场景:
- 当希望在派生类中修改或扩展基类方法的行为时,使用Virtual和Override关键字。
- 当希望隐藏基类中的成员或方法,并在派生类中提供新的实现时,使用New关键字
以下代码进行详细介绍:
C#中的virtual、new、override
new相当于重载
override相当于覆盖
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
namespace ConsoleApplication1
{
class Program {
static void Main(string[] args) {
father _father = new son1();
_father.printclassname();
son _son = new son1();
_son.printclassname();
son0 _son0 = new son1();
_son0.printclassname();
}
}
public class father {
public father() { }
public void printclassname()
{
Console.WriteLine("father");
}
}
public class son : father
{
public son() { }
public new virtual void printclassname()
{
Console.WriteLine("son");
}
}
public class son0 : son
{
public son0() { }
public new virtual void printclassname()
{ Console.WriteLine("son0"); }
}
public class son1 : son0
{
public son1() { }
public override void printclassname()
{ Console.WriteLine("son1"); }
}
}
输出的答案为:father
son
son1
结论: Virtual、New和Override是面向对象编程中重要的关键字,它们在继承、多态和方法重写方面发挥着关键作用。通过使用virtual关键字,我们可以在派生类中对基类的虚拟方法进行重写,实现运行时多态性。使用new关键字,我们可以在派生类中隐藏基类的成员,并重新定义具有相同名称的成员。而使用override关键字,我们可以在派生类中重写基类的虚拟方法,实现自定义行为。这些关键字为我们提供了更大的灵活性和可扩展性,使我们能够更好地组织和设计面向对象的代码。
希望本博客能够帮助读者更好地理解Virtual、New和Override关键字的概念和作用,并在实际编程中合理地运用它们,提高代码的可读性和可维护性。