活动介绍
file-type

C#面向对象编程:new与override的区别详解

下载需积分: 9 | 31KB | 更新于2025-05-08 | 15 浏览量 | 3 评论 | 9 下载量 举报 收藏
download 立即下载
在面向对象编程(OOP)中,C#语言提供了几种方式来定义和扩展类的功能,其中"new"和"override"是两种常用的修饰符,它们在类的继承中扮演着关键角色。这两个关键字虽然用途迥异,但在实际开发中常常会被混淆。本文将通过一个小例子来阐述C#中动态绑定和静态绑定的概念,并解析"new"和"override"的区别。 首先,我们需要理解C#中的动态绑定(Dynamic Binding)和静态绑定(Static Binding): - 静态绑定:指的是在编译时期,根据变量或表达式的类型确定调用哪个方法。编译器在编译时就已经确定了方法的地址,不需要在运行时决定。C#中的"new"关键字就是与静态绑定相关的。 - 动态绑定:指的是在运行时,根据对象的实际类型来确定调用哪个方法。这是运行时多态性的基础。C#中的"override"关键字就是与动态绑定相关的。 下面,我们通过一个简单的例子来说明"new"和"override"的使用和区别。 ```csharp using System; public class BaseClass { public virtual void Display() { Console.WriteLine("BaseClass - Display"); } } public class DerivedClass : BaseClass { public new void Display() { Console.WriteLine("DerivedClass - Display"); } public override void Display() { Console.WriteLine("DerivedClass - override Display"); } } class Program { static void Main() { BaseClass baseObj = new BaseClass(); BaseClass derivedObj = new DerivedClass(); baseObj.Display(); // 输出: BaseClass - Display derivedObj.Display(); // 输出: BaseClass - Display DerivedClass derivedSpecificObj = new DerivedClass(); derivedSpecificObj.Display(); // 输出: DerivedClass - Display } } ``` 在这个例子中,我们定义了一个基类`BaseClass`和一个派生自`BaseClass`的`DerivedClass`。`BaseClass`中有一个虚方法`Display`。`DerivedClass`覆盖了这个方法两次,一次使用了`new`关键字,另一次使用了`override`关键字。 当创建`BaseClass`的实例`baseObj`并调用`Display`方法时,输出自然是基类中定义的"BaseClass - Display"。 当创建`DerivedClass`的实例`derivedObj`并尝试调用`Display`方法时,即便这个实例实际上是一个派生类对象,输出的仍然是"BaseClass - Display"。这是因为在`derivedObj`被声明为`BaseClass`类型时,C#编译器使用静态绑定规则,将调用绑定到了`BaseClass`的`Display`方法,而不是派生类中的方法。这就是"new"关键字的作用:它使得派生类中的方法隐藏了基类中相同名称的方法,即使它们的参数列表相同。编译器并不知道派生类中存在重写的方法,因此它遵循了静态绑定的规则。 接下来,当创建`DerivedClass`的实例`derivedSpecificObj`并调用`Display`方法时,这次输出的是"DerivedClass - Display"。这是因为`derivedSpecificObj`被明确地声明为`DerivedClass`类型,所以编译器能够看到派生类中的`Display`方法,并且在编译时期就决定了要调用这个方法。 最后,如果我们想要正确地重写基类中的方法,并在派生类中使用动态绑定,我们应该只在派生类中使用一次`override`关键字,如下所示: ```csharp public class DerivedClass : BaseClass { public override void Display() { Console.WriteLine("DerivedClass - override Display"); } } ``` 现在,无论是将`DerivedClass`的实例以`BaseClass`类型还是`DerivedClass`类型声明,调用`Display`方法都会输出"DerivedClass - override Display",因为派生类已经正确地重写了基类的方法,并且C#的运行时环境会根据对象的实际类型来确定调用哪个方法,这体现了运行时多态性。 通过这个简单的例子,我们可以看到"new"关键字在子类中定义了一个与基类同名的新方法,从而隐藏了基类的方法;而"override"关键字则允许子类提供基类方法的一个新实现,实现了运行时多态性。理解这两种机制对于掌握面向对象编程至关重要。在实际开发中,选择正确的关键字来实现期望的行为是非常重要的。

相关推荐

资源评论
用户头像
章满莫
2025.06.16
这个文档深入浅出地解释了C#中new和override的使用场景,非常适合初学者理解。
用户头像
神康不是狗
2025.05.18
通过实例解析动态与静态绑定,文档让复杂概念变得易于理解。🐕
用户头像
杜拉拉到杜拉拉
2025.04.27
标题简洁明了,内容贴近实际,有助于加深对面向对象概念的掌握。🎊