You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:30:04