C#中重写、重载和隐藏的概念
封面图
•
2025-12-13
•
.NET
211
0
0
0
在C#中,**重写(Override)**、**重载(Overload)** 和 **隐藏(Hiding)** 是面向对象编程中的重要概念,它们都与方法的定义和使用有关,但各自有不同的用途和实现方式。下面分别解释这三个概念: --- ## 一、重写(Override) ### 定义: **重写** 是指在子类中重新定义父类中已有的虚方法(`virtual`、`abstract` 或 `override` 方法)。它实现了**多态**(Polymorphism)的一种形式。 ### 特点: - 只能用于**继承关系**。 - 父类的方法必须是 `virtual`、`abstract` 或 `override`(在 C# 8.0 之后支持 `override` 在接口中)。 - 子类通过 `override` 关键字来覆盖父类的方法。 - 调用时根据实际对象类型调用相应的方法(运行时多态)。 ### 示例: ```csharp public class Animal { public virtual void Speak() { Console.WriteLine("Animal speaks"); } } public class Dog : Animal { public override void Speak() { Console.WriteLine("Dog barks"); } } ``` ### 使用: ```csharp Animal a = new Dog(); a.Speak(); // 输出:Dog barks ``` --- ## 二、重载(Overload) ### 定义: **重载** 是指在同一个类中,定义多个方法,它们的**方法名相同**,但**参数列表不同**(参数类型、数量或顺序不同)。 ### 特点: - 不涉及继承。 - 仅在同一个类中。 - 编译器根据参数的不同自动选择合适的方法。 ### 示例: ```csharp public class MathUtils { public int Add(int a, int b) { return a + b; } public double Add(double a, double b) { return a + b; } public int Add(int a, int b, int c) { return a + b + c; } } ``` ### 使用: ```csharp MathUtils utils = new MathUtils(); Console.WriteLine(utils.Add(2, 3)); // 输出:5 Console.WriteLine(utils.Add(2.5, 3.5)); // 输出:6.0 Console.WriteLine(utils.Add(1, 2, 3)); // 输出:6 ``` --- ## 三、隐藏(Hiding) ### 定义: **隐藏** 是指在子类中定义一个与父类中同名的方法,但**不使用 `override`**,从而**屏蔽**了父类的方法。这种行为称为“方法隐藏”或“名称隐藏”。 ### 特点: - 通常不推荐使用,因为容易引起混淆。 - 如果子类中定义了一个与父类同名的方法,而没有使用 `override`,那么父类的方法会被“隐藏”。 - 使用 `new` 关键字可以显式声明这是隐藏,避免警告。 ### 示例: ```csharp public class Animal { public void Speak() { Console.WriteLine("Animal speaks"); } } public class Dog : Animal { public new void Speak() { Console.WriteLine("Dog barks"); } } ``` ### 使用: ```csharp Animal a = new Dog(); a.Speak(); // 输出:Animal speaks(因为是 Animal 类型,调用的是父类方法) Dog d = new Dog(); d.Speak(); // 输出:Dog barks(因为是 Dog 类型,调用的是子类方法) ``` > 注意:如果直接使用 `new` 关键字,编译器会发出警告(除非使用 `new` 显式声明),表示你可能意图隐藏方法。 --- ## 总结对比表 | 概念 | 是否涉及继承 | 是否改变方法签名 | 是否支持多态 | 是否需要关键字 | |------|----------------|------------------|----------------|----------------| | 重写(Override) | ✅ 是 | ❌ 否(方法签名相同) | ✅ 是(运行时多态) | ✅ `override` | | 重载(Overload) | ❌ 否 | ✅ 是(方法签名不同) | ❌ 否 | 无 | | 隐藏(Hiding) | ✅ 是 | ❌ 否(方法签名相同) | ❌ 否 | ✅ `new`(可选) | --- ## 小结 - **重写**:实现多态,覆盖父类方法。 - **重载**:同一类中方法名相同,参数不同。 - **隐藏**:子类定义同名方法,不使用 `override`,可能会导致歧义。 如果你有具体的代码示例或疑问,欢迎继续提问!
上一篇:
如何生成 Web Service 代理类型
下一篇:
.NET中怎么把程序集放入 GAC 中
标题录入,一次不能超过6条
留言
评论