Visual Studio中的多态

目录

一、静态多态

1.函数重载

2.符号重载

3.静态多态的特点

二、动态多态

[1.继承 + 虚方法](#1.继承 + 虚方法)

2.抽象类

3.动态多态的特点

[4. 继承+抽象类 与 抽象类](#4. 继承+抽象类 与 抽象类)

[三、静态多态 与 动态多态 的对比](#三、静态多态 与 动态多态 的对比)


多态是面向对象编程的三大特性之一,指同一行为在不同对象上表现出不同的形态 。在 Visual Studio 中,多态主要分为静态多态 (编译时多态)和动态多态 (运行时多态),二者的核心区别在于方法调用的绑定时机。

一、静态多态

静态多态是指在编译阶段就确定调用哪个方法,绑定过程由编译器完成。

实现方式:

1.函数重载

在同一类中定义多个同名方法,通过参数的类型、数量或顺序 区分;即在同一个范围内,函数名一样,参数类型不一样,参数个数不一样。

示例:

class Calculator

{

public int Add(int a, int b) => a + b;

public double Add(double a, double b) => a + b ; // 参数类型不同

public int Add(int a, int b, int c) => a + b + c ; // 参数数量不同

}

2.符号重载

重定义运算符 (如 +、-)的行为,使其支持自定义类型;即把常用的算数运算符号、逻辑运算符号按照自己定义的方式进行运算,且需要将方法定义成静态的方法,在重载的符号前添加关键字operator

示例:

public static Vector operator +(Vector a, Vector b)

{

return new Vector(a.X + b.X, a.Y + b.Y); //重载 "+" 运算符

}

3.静态多态的特点

编译时绑定:编译器根据方法签名(名称+参数)直接确定调用目标。

性能高:无需运行时类型检查,执行速度快。

灵活性低:无法动态改变行为,仅适用于编译时已知类型的场景。

二、动态多态

动态多态是指在运行阶段才确定调用哪个方法。

实现方式:

1.继承 + 虚方法

说明及特点:

父类定义 virtual 方法,子类用 override 重写。

虚成员和虚方法可以定义在普通类里面;

虚成员和虚方法可以在普通类里面实现;

虚成员和虚方法可以不用在派生类里面实现。

示例:

class Animal

{

public virtual void Speak() //基类 创建虚方法

{

Console.WriteLine("动物叫");

}}

class Dog : Animal //继承基类

{

public override void Speak() //派生类 虚方法 -- 重写

{

Console.WriteLine("汪汪");

} }

2.抽象类

抽象类说明及特点:

用于提供类的部分成员实现 ,抽象类中可以包含抽象方法,也可以包含普通方法

抽象方法,不用去实现方法,谁继承这个抽象类谁去实现抽象方法

抽象类里面也可以定义抽象成员,抽象成员需要在派生类(子类)里去实现

包含 abstract 方法的类,子类必须实现所有抽象方法。

示例:

public abstract class People

{

public int Age { get; set; } = 10; // 普通的属性

//public abstract string Name { get; set; } = "aaa"; // 抽象属性 不能赋值

public abstract string Name { get; set; }

//普通方法可以正常定义和实现

public void Eat()

{

Console.WriteLine("bbb");

}

//抽象方法不能有方法体 不能加{}

public abstract void SayHello(int a) ;

}

//在子类实现抽象成员

public class CC : People

{

//需要重写抽象成员和抽象方法,添加重写关键字 override

public override string Name { get; set; } = "ccc";

//重写抽象方法

public override void SayHello(int a)

{

Console.WriteLine("ddd");

}

}

3.动态多态的特点

运行时绑定 : CLR 根据对象的实际类型(而非声明类型)决定调用哪个方法。

灵活性高: 支持动态替换行为,是实现"开闭原则"的核心手段。

性能略低 : 需要额外的类型检查和方法表查找。

4. 继承+抽象类 与 抽象类

1.抽象成员和抽象方法只能定义在抽象类里面 但是虚成员和虚方法可以定义在普通类里面

2.抽象成员和抽象方法在抽象类里面不能实现 但是虚成员和虚方法可以在普通类里面实现

3.抽象成员和抽象方法在派生类里面必须实现 但是虚成员和虚方法可以不用在派生类里面实现

4.可以使用 override 重写基类里面的抽象方法或者虚方法

三、静态多态 与 动态多态 的对比

|----------|--------------------------|-----------------------|
| 对比维度 | 静态多态 | 动态多态 |
| 绑定时机 | 编译时 | 运行时 |
| 实现基础 | 方法签名(参数差异) | 继承、虚方法、接口 |
| 调用目标 | 编译器确定 | CLR 根据对象实际类型确定 |
| 灵活性 | 低(编译后无法修改) | 高(支持动态替换) |
| 典型场景 | 工具类方法(如 Math.Abs 重载) | 框架扩展(如插件化架构、依赖注入) |

相关推荐
L@ncor10 小时前
第五章 基于低代码平台的智能体搭建 · 学习笔记(Coze / Dify / FastGPT / n8n)
笔记·学习·低代码·agent·prompt工程
知潮网10 小时前
被嫌弃的五仁月饼,一吨千元在养猪场翻了身
笔记
2601_9606312310 小时前
中药前处理及提取的工艺环节与技术要点
笔记
2601_9653842610 小时前
口腔黏膜清洁中的几何约束与流体动力学边界层问题分析
经验分享·笔记
一米阳光866110 小时前
软考高级【信息系统项目管理师】高项重要考点(9)组织 助你顺利上岸!
笔记·职场发展·软考·高项·信息系统项目管理师·高级职称
白杨尚青11 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
Chen—LSN11 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
Chen—LSN12 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
Lintongzg12 小时前
千卡训练的隐形账单:通信不是瓶颈
笔记·学习·性能优化·llm
LuminousCPP13 小时前
从零开始学 C++(三):类和对象入门|从 struct 到 class,理解封装、对象与 this 指针
c++·笔记·学习·类和对象