在C#中,方法重载与多态的区别是什么?请举例说明
C#中方法重载(Method Overloading)与多态(Polymorphism)的差异及示例
一、方法重载(编译时多态)
方法重载是同一类中定义多个同名方法,通过参数列表的差异(参数个数、类型、顺序不同)来区分,返回值类型不作为重载判断依据。它是编译阶段就确定好调用哪个方法的,属于静态多态。
重载示例
public class StringHelper { // 拼接两个字符串 public string Concatenate(string str1, string str2) { return str1 + str2; } // 拼接三个字符串 public string Concatenate(string str1, string str2, string str3) { return str1 + str2 + str3; } // 拼接字符串和整数 public string Concatenate(string str, int num) { return str + num.ToString(); } } // 调用示例 var helper = new StringHelper(); string result1 = helper.Concatenate("Hello", "World"); // 调用双字符串参数版本 string result2 = helper.Concatenate("a", "b", "c"); // 调用三字符串参数版本 string result3 = helper.Concatenate("Number: ", 100); // 调用字符串+整数版本
编译时编译器会根据你传入的参数类型、个数,直接绑定到对应的重载方法,运行时不会再改变。
二、多态(运行时多态)
多态基于继承关系,通过父类的虚方法(virtual)、抽象方法(abstract),结合子类的重写(override)实现。调用方法时,会根据实际创建的对象类型来执行对应的重写方法,而不是变量的声明类型,属于动态多态。
多态示例
public class Shape { // 虚方法,允许子类重写 public virtual void Draw() { Console.WriteLine("绘制基础图形"); } } public class Circle : Shape { public override void Draw() { Console.WriteLine("绘制圆形"); } } public class Rectangle : Shape { public override void Draw() { Console.WriteLine("绘制矩形"); } } // 调用示例 Shape shape1 = new Circle(); Shape shape2 = new Rectangle(); shape1.Draw(); // 实际执行Circle的Draw方法,输出"绘制圆形" shape2.Draw(); // 实际执行Rectangle的Draw方法,输出"绘制矩形"
这里变量shape1的声明类型是Shape,但实际指向的是Circle对象,运行时会动态找到Circle中重写的Draw方法执行。
三、核心差异对比
| 维度 | 方法重载 | 多态 |
|---|---|---|
| 实现时机 | 编译时确定调用方法 | 运行时确定调用方法 |
| 实现条件 | 同一类中,方法名相同、参数列表不同 | 继承关系,父类虚/抽象方法+子类重写 |
| 调用依据 | 传入的参数类型、个数、顺序 | 实际创建的对象类型 |
| 核心作用 | 简化同名功能的不同参数调用方式 | 统一接口,适配不同子类的差异化实现 |
内容的提问来源于stack exchange,提问作者Sameer
相关产品推荐
相关产品推荐

