C# 多态 + 函数重载(静态多态)+运算符重载

一、多态分类(必考概念)

1. 静态多态(编译期多态)

程序编译阶段就确定调用哪个方法

包含:函数重载、运算符重载

2. 动态多态(运行期多态)

程序运行阶段才动态确定调用哪个方法

依靠:继承 + virtual/override 重写、抽象类、接口实现


二、函数重载(静态多态核心)

1. 函数重载满足的三个硬条件(必须全背)

  • 方法名必须完全相同

  • 参数个数 或 参数类型 或 参数顺序不同

  • 仅返回值不同,不构成重载(超级易错)

2. 你代码中所有合法重载案例

复制代码
// 1.无参数
public static void F1()

// 2.一个int参数(参数类型不同)
public static void F1(int a)

// 3.一个string参数(参数类型不同)
public static void F1(string a)

// 4.string+int 两个参数(个数不同)
public static void F1(string a,int b)

// 5.int+string 顺序不同(参数顺序不同,构成重载)
public static void F1(int b,string a)

// 6.bool参数(类型不同,虽然返回值不同,但依然构成重载)
public static int F1(bool b)

三、重点解析:返回值不影响重载

正确理解

判断是否为重载,只看参数列表,和返回值、修饰符无关。

你代码中:

void F1(int)int F1(bool)

之所以是重载,是因为参数类型不同,不是因为返回值不同。

致命错误(考试最爱考)

复制代码
public void F1(int a)
public int F1(int a)  
// ❌ 不构成重载!仅仅返回值不同,参数一模一样,直接报错

四、参数顺序不同也构成重载

这是很多同学的盲区:

复制代码
F1(string a, int b)
F1(int b, string a)
// ✅ 参数列表顺序不同,属于合法重载

五、完整可运行整理代码

复制代码
namespace _9多态_函数重载
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 自动匹配不同重载方法
            F1();
            F1(10);
            F1("测试");
            F1("aa", 100);
            F1(200, "bb");
            F1(true);
        }

        #region 函数重载组
        public static void F1()
        {
            Console.WriteLine("F1不带参数");
        }
        public static void F1(int a)
        {
            Console.WriteLine("F1带一个int参数");
        }
        public static void F1(string a)
        {
            Console.WriteLine("F1带一个string参数");
        }
        public static void F1(string a, int b)
        {
            Console.WriteLine("F1带俩个参数(string+int)");
        }
        public static void F1(int b, string a)
        {
            Console.WriteLine("F1带俩个参数(int+string)");
        }
        public static int F1(bool b)
        {
            Console.WriteLine("F1带1个bool参数");
            return 10;
        }
        #endregion
    }
}

六、考试简答题满分模板

1. 什么是函数重载?

在同一个类中,方法名相同,参数列表(个数、类型、顺序)不同的多个方法,称为函数重载。函数重载属于静态多态,在编译阶段确定调用方法,仅返回值不同不构成重载。

2. 多态分为哪两种?

分为静态多态和动态多态。静态多态通过函数重载、运算符重载实现,编译期绑定;动态多态通过继承和方法重写实现,运行期绑定。


七、终极背诵口诀

重载三要:同名、参不同、返回随便行

参不同三情况:个数、类型、顺序换

只改返回不算数,编译报错不能用

重载属于静态态,编译绑定不用等

------------------------运算符重载------------------------------

一、运算符重载核心概念

运算符重载 :重新定义系统运算符的运算逻辑,让自定义类的对象支持加减、自增、大小比较等运算。

作用:默认对象不能直接做运算,重载运算符后,可实现 对象+对象、对象>对象、对象++ 等操作。

归属:属于 静态多态(编译期多态)

二、运算符重载固定语法(死格式、必须背)

复制代码
public static 返回值类型 operator 运算符(参数1,参数2)
{
    // 自定义运算逻辑
}

强制规则:

  • 必须是 public static 修饰,缺一不可

  • 必须使用 operator 关键字

  • 参数个数固定:双目运算符2个参数,单目运算符1个参数

三、本案例业务逻辑说明

自定义箱子类 Box,包含长宽高、体积属性

  • + 重载:两个箱子长宽高分别相加,返回新箱子对象

  • - 重载:两个箱子体积相减,返回int差值

  • ++ 重载:箱子长宽高各自+1,返回新对象

  • > < 重载:根据箱子体积做大小比较,返回布尔值

四、逐段重载代码解析

1. 加号 + 重载(双目运算符)

复制代码
public static Box operator+(Box b1,Box b2)
{
    return new Box()
    {
        Length = b1.Length + b2.Length,
        Width = b1.Width + b2.Width,
        Height = b1.Height + b2.Height
    };
}

功能:两个Box对象属性分别相加,返回全新Box对象

调用:Box b3 = b1 + b2;

2. 减号 - 重载(返回值类型灵活)

复制代码
public static int operator-(Box b1,Box b2)
{
    return b1.Length * b1.Width * b1.Height - b2.Length * b2.Width * b2.Height;
}

重点:和加号不同,这里返回 int 体积差值,不一定非要返回本类对象

调用:int b4 = b1 - b2;

3. 自增 ++ 重载(单目运算符)

复制代码
public static Box operator++(Box b1)
{
    return new Box()
    {
        Length = b1.Length + 1,
        Width = b1.Width + 1,
        Height = b1.Height + 1,
    };
}

特点:只有一个参数,返回新对象(原对象不变)

执行结果解析:

  • b5 = b1++

  • b5 保存 自增前 的旧数据(Length=10)

  • b1 变为自增后新数据(Length=11)

4. 大于、小于比较重载

复制代码
//重载大于
public static bool operator>(Box b1,Box b2)
{
    return b1.Volume > b2.Volume;
}

//重载小于
public static bool operator <(Box b1, Box b2)
{
    return b1.Volume < b2.Volume;
}

规则:成对重载,不能只重载一个

逻辑:不再比较对象地址,而是自定义比较体积大小

五、程序完整输出结果

40:60:80 (b1+b2 长宽高相加结果)

10400 (体积差值)

11 (自增后b1)

10 (自增前赋值给b5)

False (b1体积不大于b2)

True (b1体积小于b2)

六、必考语法坑点(易错)

  • 运算符重载方法必须 public static,缺一报错

  • 双目运算符必须传 两个参数 ,单目运算符传 一个参数

  • 比较运算符 > < == != 必须成对重载

  • 重载只是重写运算逻辑,不会改变运算符优先级

  • 自增重载:默认返回新对象,原对象数据不直接修改

  • 返回值不固定:可以返回对象、int、bool 任意类型

七、简答题满分模板

1. 什么是运算符重载?

运算符重载属于静态多态,通过operator关键字重新定义运算符的运算规则,让自定义类型对象支持运算符运算,提升代码的可读性与灵活性,在编译阶段确定执行逻辑。

2. 运算符重载的语法要求?

必须使用public static修饰,通过operator关键字搭配运算符实现重载,双目运算符需要两个参数,单目运算符需要一个参数,比较运算符需要成对重载。

八、终极背诵口诀

运算符重载静态态,public static不能带

operator接符号,参数个数分单双

比较符号要成对,自定义规则对象算

编译绑定静态态,多态复用更简单

相关推荐
码不停蹄的玄黓1 小时前
Java 应用 CPU 过高排查全流程
java·开发语言·python
Fms_Sa1 小时前
分治法—最大子段问题
算法·c#
rick9771 小时前
C# 动态对象实战:用 DynamicObject 打造你的"万能插件架构"
c#
江畔柳前堤1 小时前
XZ09_Word和MD格式转换
开发语言·数据库·人工智能·python·深度学习·word
ZenosDoron1 小时前
malloc规范
java·开发语言
codeejun1 小时前
每日一Go-71、理论知识:CAP 、一致性原理 、Raft 机制(简化实现一个 Raft)
java·开发语言·golang
Aotman_1 小时前
JavaScript数组对象中指定字段转换
java·开发语言·前端·javascript·vue.js·前端框架·es6
星河漫步Lu1 小时前
Anaconda搭建深度学习虚拟环境
开发语言·python·深度学习
gCode Teacher 格码致知1 小时前
Python教学:十六进制编码的显示方法-由Deepseek产生
开发语言·python·算法