
C#面向对象编程:new与override的区别详解
下载需积分: 9 | 31KB |
更新于2025-05-08
| 15 浏览量 | 3 评论 | 举报
收藏
在面向对象编程(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
标题简洁明了,内容贴近实际,有助于加深对面向对象概念的掌握。🎊

newFishInTheSea
- 粉丝: 0
最新资源
- 适用于RedHat6.5的Mondo Rescue压缩包
- Java验证码生成库:Kaptcha与Jcaptche整合教程
- Resin Pro 3.1.8版本发布与特性介绍
- 深入探讨DLL内存加载技术及其应用
- 安卓屏幕亮度调节教程及seekbar示例
- 深入分析openssl-1.0.1u版本特点及应用
- Mallmold外贸建站系统5.0无毒开源版
- 全局过TP驱动保护检测技术分析
- Zemax2009安装教程及压缩包下载
- OrangeOs操作系统源代码及镜像文件发布
- Apache Tomcat 8.0.9版本Windows x64平台安装包发布
- 中兴U116+无线座机固件升级 支持联通移动SIM卡
- Spring框架定时任务实现及打包案例分享
- 动态天气预报原理及雨雪效果实现
- SQLyog10压缩包文件解压缩指南
- PIC24单片机Bootloader软件开发与应用
- Java龙果支付开源项目,功能强大,免费分享
- Spring4.3.2与Spring-Security4.1.3集成示例教程
- 纯C/C++实现的AES加密与解密示例程序
- CJ源代码的探索与应用
- 掌握HookD3D技术:在DirectX中实现文本绘制
- 深度解析最新版本eigen库3.2.10的特性与应用
- Office系列版本间完美兼容转化解决方案
- 掌握jquery-i18n-properties实现多语言网站