当前位置: 首页 > article >正文

深入解析C#多态性:基类引用、虚方法与覆写机制

基类引用的本质

在C#面向对象编程中,派生类对象由基类部分和扩展部分组成。通过基类引用访问派生类对象时,实际是在进行「观察视角」的转换:

MyDerivedClass derived = new MyDerivedClass(); 
MyBaseClass mybc = (MyBaseClass)derived;  // 视角转换 
  • 🔑 基类引用只能访问继承链中的成员
  • ⚠️ 无法通过基类引用访问派生类新增成员(如示例中的var1)
  • 🖼️ 内存布局:基类部分始终位于对象内存起始位置

虚方法的多态魔法

当使用virtual和override组合时,将实现真正的多态行为:

// 基类定义 
virtual public void Print() { ... }// 派生类覆写 
override public void Print() { ... }

✅ 调用链规则:

  • 通过基类引用调用时,自动寻找最高派生版本的实现
  • 实际执行的是运行时类型的方法(动态绑定)

🚫 常见错误:

  • 覆写方法访问级别不一致
  • 试图覆写非虚方法
  • 忘记override使用new导致隐藏而非覆写

多层继承中的覆写策略

在三级继承体系中,覆写行为呈现链式反应:

class Base { virtual void Print() }
class Derived : Base { override void Print() }
class SecondDerived : Derived { ... }
修饰符调用结果内存表现
override执行最顶层派生类方法法表指针指向最新实现
new停留在当前继承层级的实现创建独立方法槽,与基类实现并存

实战对比:override vs new

通过代码实验验证不同修饰符的效果差异:

// 情况1:使用override 
SecondDerived.Print => "SecondDerived"
mybc.Print => "SecondDerived"// 情况2:使用new 
SecondDerived.Print => "SecondDerived" 
mybc.Print => "Derived"

📊 执行原理图解:

  • override形成方法调用链
  • new创建独立方法分支
  • 虚方法表(vtable)的结构差异

扩展应用:属性与索引器的覆写

多态机制不仅限于方法,同样适用于属性:

class Base {virtual int MyProp { get { return 5; } }
}class Derived : Base {override int MyProp { get { return 10; } }
}

📌 属性覆写需保持:

  • 相同的名称和返回类型
  • 一致的访问器签名(get/set)

💡 索引器覆写同理:

  • 保持参数列表一致
  • 使用virtual/override修饰

最佳实践指南

合理设计虚方法:

  • 将可能变化的逻辑声明为virtual
  • 保持基类方法的稳定性

谨慎使用new修饰符:

  • 仅当需要刻意隐藏基类实现时使用
  • 添加XML注释说明隐藏意图

多态设计原则:

  • 遵循里氏替换原则
  • 通过抽象基类定义契约
  • 使用protected保护核心实现

关键理解:多态的本质是通过类型引用与对象实体的分离,实现「同一接口,多种实现」的面向对象特性。掌握虚方法机制,能显著提升代码的扩展性和可维护性。

http://www.lryc.cn/news/2394141.html

相关文章:

  • SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!
  • C++中 newdelete 与 mallocfree 的异同详解
  • 晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册
  • STM32入门教程——LED闪烁LED流水灯蜂鸣器
  • 鸿蒙OSUniApp 实现的数据可视化图表组件#三方框架 #Uniapp
  • Tornado WebSocket实时聊天实例
  • HarmonyOS鸿蒙与React Native的融合开发模式以及能否增加对性能优化的具体案例
  • 化学分析原理。
  • 开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案
  • 元胞自动机(Cellular Automata, CA)
  • 智能手表单元测试报告(Unit Test Report)
  • 微深节能 码头装卸船机定位与控制系统 格雷母线
  • 基于matlab遗传算法和模拟退火算法求解三维装箱优化问题
  • 在Spring Boot中集成Redis进行缓存
  • Python实现P-PSO优化算法优化循环神经网络LSTM分类模型项目实战
  • OSG编译wasm尝试
  • Scratch节日 | 龙舟比赛 | 端午节
  • Ubuntu搭建DNS服务器
  • electron开发百度桌面应用demo及如何打包应用
  • 关于用Cloudflare的Zero Trust实现绕过备案访问国内站点说明
  • 2025年DDoS混合CC攻击防御全攻略:构建智能弹性防护体系
  • 方正字库助力华为,赋能鸿蒙电脑打造全场景字体解决方案
  • STM32 串口通信①:USART 全面理解 + 代码详解
  • 【Java Web】速通CSS
  • List 源码翻译
  • NHANES指标推荐:ALI
  • ChatGPT与认知科学:人机协同的未来图景
  • 数智管理学(十二)
  • UE5 Mat HLSL - Load
  • 【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程