为什么go和rust语言都舍弃了继承?

Go 和 Rust都故意不提供传统的类继承(class inheritance),核心原因高度一致:继承虽然看起来方便,但长期来看它带来的问题往往大于它解决的问题。两门语言的设计者都把“组合优于继承”(Composition over Inheritance)当作重要的设计原则,并通过语言机制强制或强烈引导开发者往这个方向走。

下面从实际痛点、设计哲学和语言提供的替代方案三个维度来拆解为什么它们选择“舍弃”继承。

1. 继承在大型项目中真正带来的主要问题(也是被舍弃的主因)

问题类型继承带来的典型表现为什么在现代大规模工程中很致命Go / Rust 亲身经历的教训来源
紧耦合 & 脆弱基类问题子类严重依赖父类实现细节,改父类容易炸子类父类一改动,整个继承树都可能需要修改或重测C++ / Java 大型代码库的真实灾难
菱形继承 / 多重继承地狱多继承导致命名冲突、虚继承、内存布局复杂调试和理解成本爆炸C++ 的历史包袱
语义不清晰(is-a vs has-a 滥用)把“has-a”关系错误地写成“is-a”继承领域模型扭曲,后期重构极难Java / C# 企业项目常见反例
实现继承 vs 接口继承混淆同时继承行为和数据,难以单独复用行为代码复用方式单一且不灵活传统 OOP 框架的通病
测试 / Mock 困难子类紧绑父类实现,单元测试很难 mock 父类行为TDD / 测试覆盖率难以推进Go 社区特别强调这一点
性能 & 内存布局不可预测虚函数表、对象 slicing、多重继承内存布局复杂Rust 尤其在意零成本抽象和可预测性Rust 内存安全 + 性能双目标

一句话总结:继承是“纵向复用”,但它把复用和“类型层次”强绑定在一起,导致耦合度过高、灵活性过低

2. Go 和 Rust 分别用什么机制替代继承(它们其实殊途同归)

语言替代继承的核心机制怎么实现“类似继承”的效果强制/引导程度
Go匿名嵌入(struct embedding) + 接口把一个结构体匿名嵌入另一个结构体 → 自动获得其方法(委托)
接口实现“鸭子类型”多态
非常强(根本没类和继承语法)
RustTrait + 泛型 + 组合(struct 嵌套)用 Trait 定义行为
用泛型 / impl 为具体类型实现 Trait
数据直接组合(has-a)
极强(连 class 关键字都没有)

两者共同点:

  • 行为复用→ 通过接口 / trait(横向的、松耦合的)
  • 数据复用→ 通过组合(把需要的字段直接嵌进去)
  • 不存在“父类引用指向子类对象”的隐式向上转型(Go 接口值、Rust dyn Trait 才有动态分发)

3. 设计者公开表达过的核心动机(提炼版)

  • Go(Rob Pike 等)
    “我们观察到,大型面向对象系统中,继承链越长,维护成本越高。我们想要简单、可预测、可组合的语言。接口 + 嵌入已经足够表达绝大多数需求,而且更清晰。”

  • Rust(Graydon Hoare 等早期设计者)
    “继承与 Rust 的内存模型、安全模型、零成本抽象目标严重冲突。虚函数表 + 对象布局继承会破坏所有权、生命周期、Send/Sync 等安全保证。组合 + trait 能达到甚至超过继承的表达力,同时保持可预测的性能和安全性。”

4. 一个极简对比表(实际使用感受)

你想实现的效果用继承(Java/C#风格)怎么写用 Go 风格写用 Rust 风格写谁更清晰/灵活?
“汽车是交通工具”class Car extends Vehicletype Car struct { Vehicle }struct Car { vehicle: Vehicle }Go/Rust 更明确是 has-a
添加“可飞行”能力class FlyingCar extends Car implements Flyable再嵌入 Flyable struct 或实现 Flyable 接口impl Flyable for Car { … }Trait 胜出
替换引擎实现(mock 测试)很难(紧耦合父类)很容易(组合可以换掉字段)很容易(依赖注入 + trait object)组合完胜

小结

Go 和 Rust 舍弃继承,不是因为它们“不支持面向对象”,而是因为它们认为传统的类继承是一种过时的、弊大于利的代码复用方式

它们用更松耦合、更可组合、更可测试的机制(接口/trait + 组合)来取代继承,在实际大型项目中表现出了更高的长期可维护性和更低的意外复杂度。这也是为什么“组合优于继承”这句话从 90 年代的建议,变成了 2020 年代很多现代语言的强制设计选择

你现在写代码时,是更倾向于用继承,还是已经习惯组合 + 接口/trait 的写法了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1218315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Silk V3音频解码技术实践指南:从环境搭建到故障排除

Silk V3音频解码技术实践指南:从环境搭建到故障排除 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. 项目…

BilibiliDown视频下载工具全攻略:多场景解决方案与高效使用指南

BilibiliDown视频下载工具全攻略:多场景解决方案与高效使用指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_…

Android设备控制与跨平台工具:QtScrcpy零基础入门指南

Android设备控制与跨平台工具:QtScrcpy零基础入门指南 【免费下载链接】QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制。无需root权限。 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy QtScrcpy是一款专…

戴森球计划蓝图仓库新手指南:零门槛构建高效生产体系

戴森球计划蓝图仓库新手指南:零门槛构建高效生产体系 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 戴森球计划FactoryBluePrints蓝图仓库是新手玩家快速掌握高…

YOLOE部署踩坑记录:这些错误千万别犯

YOLOE部署踩坑记录:这些错误千万别犯 刚拿到YOLOE官版镜像时,我满心期待——开放词汇检测、零样本迁移、实时分割,听起来就像给目标检测装上了“人眼大脑”。可现实很快给了我一记重击:第一次运行predict_text_prompt.py就卡在CU…

mptools v8.0在CS32系列中的应用完整示例

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。我以一位资深嵌入式系统工程师兼教学博主的身份,彻底摒弃模板化表达、AI腔调和教科书式分段,转而采用 真实项目现场的语言节奏 工程师间对话感 关键细节深挖 可复用的实战经验沉淀…

如何通过用户脚本优化123云盘使用体验

如何通过用户脚本优化123云盘使用体验 【免费下载链接】123pan_unlock 基于油猴的123云盘解锁脚本,支持解锁123云盘下载功能 项目地址: https://gitcode.com/gh_mirrors/12/123pan_unlock 123云盘作为常用的文件存储与分享平台,其基础功能常受限于…

3步完成LivePortrait跨平台部署:让静态肖像动起来的AI工具全指南

3步完成LivePortrait跨平台部署:让静态肖像动起来的AI工具全指南 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 你是否想过让老照片里的人物微笑、让手绘肖像转头说话&#xff1f…

深度测评9个AI论文网站,专科生轻松搞定毕业论文!

深度测评9个AI论文网站,专科生轻松搞定毕业论文! AI 工具如何助力专科生轻松应对毕业论文 在当前的学术环境中,AI 工具已经成为许多学生解决论文写作难题的重要助手。尤其是对于专科生而言,面对繁重的学业压力和对论文格式、内容…

英雄联盟LCU接口应用框架:Akari技术架构与实践指南

英雄联盟LCU接口应用框架:Akari技术架构与实践指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 项目概述 League-…

打造智能协作机械臂:LeRobot SO-101从硬件到控制全攻略

打造智能协作机械臂:LeRobot SO-101从硬件到控制全攻略 【免费下载链接】lerobot 🤗 LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot LeRobot SO-10…

B站直播推流专业指南:从原理到实战的技术解析

B站直播推流专业指南:从原理到实战的技术解析 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和标题功能 项…

Qwen3-1.7B效果惊艳!猫娘角色生成案例展示

Qwen3-1.7B效果惊艳!猫娘角色生成案例展示 你有没有试过,和一个既会撒娇又带点小傲娇、说话软糯还藏着小心思的虚拟角色聊天?不是冷冰冰的问答机器人,而是真正能让你心头一颤、嘴角上扬的“猫娘”——她会因为你一句“我不爱你了…

解密高效翻译:Crow Translate如何引发效率革命

解密高效翻译:Crow Translate如何引发效率革命 【免费下载链接】crow-translate Crow Translate - 一个用C/Qt编写的简单轻量级翻译器,支持使用Google、Yandex、Bing等API进行文本翻译和朗读。 项目地址: https://gitcode.com/gh_mirrors/cr/crow-tran…

YimMenu游戏助手完全掌握指南:从入门到精通

YimMenu游戏助手完全掌握指南:从入门到精通 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu 核…

5分钟上手GPEN图像修复,科哥版WebUI一键增强老照片

5分钟上手GPEN图像修复,科哥版WebUI一键增强老照片 你是不是也翻出过泛黄的老相册?那张被岁月模糊了轮廓的全家福、那张边角卷曲却笑容灿烂的毕业照、还有那张因保存不当而布满噪点的童年合影……它们承载着真实的情感,却困在低画质里。现在…

如何解决AList夸克TV驱动授权二维码过期问题:3种实用方案

如何解决AList夸克TV驱动授权二维码过期问题:3种实用方案 【免费下载链接】alist alist-org/alist: 是一个基于 JavaScript 的列表和表格库,支持多种列表和表格样式和选项。该项目提供了一个简单易用的列表和表格库,可以方便地实现各种列表和…

降噪麦克风搭配使用,识别准确率再提升

降噪麦克风搭配使用,识别准确率再提升 在日常语音识别实践中,很多人会遇到一个共同问题:明明模型很强大,但识别结果却总差那么一口气。尤其在会议记录、远程访谈、教学录音等真实场景中,环境噪音、设备差异、说话习惯…

光纤光源聚焦模式的像差效应

摘要 光纤是光学系统中广泛使用的光源。因此,研究光学系统的像差对光纤模式传播的影响是有意义的。在本用例中,我们使用VirtualLab Fusion中的快速物理光学引擎来演示由阶跃或梯度折射率光纤产生的一组模式的形状,以及由它们的组合产生的光…

基于MATLAB的GFSK调制解调实现

一、GFSK调制解调原理 GFSK(高斯频移键控)是一种通过高斯低通滤波预处理的FSK调制技术,其核心流程包括:差分编码:消除相位模糊(如蓝牙规范要求)高斯滤波:平滑符号跳变,控制频谱带宽(BT=0.5时带宽为0.5/Tsym)…