首页 > 其他分享 >为什么 Go 和 Rust 语言都舍弃了继承?

为什么 Go 和 Rust 语言都舍弃了继承?

时间:2023-12-15 15:34:53浏览次数:34  
标签:... String 舍弃 interface 具体 Go 白马 public Rust

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

❎ 舍弃了 Class
✅ 舍弃或弱化子类型

类的继承是一段儿弯路

OO 发明了继承,然后发现真正有意义的是 interface 的组合(更准确的说,是 Product type of interfaces or abstract classes),语义上相当于组合,但在 Cpp,Java 等语言中,还是使用继承来实现),具体类的继承于人的认知充满矛盾。

比如说,我们有一个类叫 “马”,可以构造除马的实例,这个类是具体的。然后,我们定义一个新的类 “白马 extends 马”,说明我们的程序世界里要开始考虑颜色了,此时,“马” 这个类实质上已经不再具体,因为不存在一批马,它的颜色是未定义。

进一步理解,马也好、白马也好,其实描述的是一种集合,后者是前者的子集。集合的唯一行为,是任给一个对象,可以判定它们是否在集合中。所以,白马,马这样的类型可以用做函数调用时的类型检查,并不能用作构造实例。它们就是 OO 中的 interface。

那么我们用什么来构造实例呢?一般我们称为构造型,或者许多 OO 语言里的构造函数,用以构造复合特定接口的对象,比如下面这一段代码

class 白马 implements 有毛色 {
    public 白马 (String id) { ... }
    public Color 毛色() { return 白色; }
}

表达的就是

interface 马  { ... }
interface 白马 extends 马, 有毛色 {...}

class 某具体马甲 implements 白马{
    public 具体马甲(String id) { ... }
    public Color 毛色() { return 白色;}
}

如果未来又有 “白色蒙古马”

完全可以定义为:

interface 马  { ... }
interface 白马 extends 马, 有毛色 {...}
interface 白色蒙古马 extends 白马, 有产地 { ... }

class 某具体马乙 implements 白色蒙古马{
    public 某具体马乙(String id) { ... }
    public Color 毛色() { return 白色; }
    public String 产地() { return 蒙古; }
}

有小伙伴可能会问,你这里马甲,马乙不还是一个没具体产地,一个有具体产地马?是的,但它两是完全无关的构造型,不存在马甲 isa 马乙,或者马乙 isa 马甲的关系,谁都不比谁更具体,也就谁不比谁更抽象,马乙有产地,并不会让马甲更抽象。我们完全还可以定义

class 某具体马丙 implements 马, 有产地{
    public 某具体马丙(String id) { ... }
    public String 产地() { return 蒙古; }
}

这大概就是我们不需要类的继承的原因吧。

至于接口的继承,本质上就是已有接口和新定义的行为构成的匿名接口的组合。两个接口的组合,其实就是两者行为的并集,表达两大接口约束对象的交集。

标签:...,String,舍弃,interface,具体,Go,白马,public,Rust
From: https://www.cnblogs.com/RioTian/p/17903460.html

相关文章

  • 安装mongo提示报错libcrypto.so.1.1解决方法
    1、输入网址:www.openssl.org第一种下载:点击Downloads→点击要下载的openssl然后解压:tar-zxvfopenssl.x.x.xx.tar.gz第二种下载:wgethttps://www.openssl.org/source/openssl-1.1.1w.tar.gz解压:tar-zxvfopenssl-1.1.1w.tar.gz切换到解压好的目录:cdopenssl-1.1.1w编译安装:./conf......
  • Mongodb安装篇+可视化工具篇
    下载MongoDB官网下载地址:DownloadMongoDBCommunityServer|MongoDB Version选择:稳定版4.4.2Mongo的版本分为稳定版和开发版,其中,稳定版是经过充分测试的版本,具有稳定性和可靠性;而开发版是未得到充分测试的版本,不适合初学者。所以我选择的稳定版本4.4.2/稳定版与开发版区......
  • Go语言学习之-带分割符的文件转excel-PLUS版
    packagemainimport( "bufio" "errors" "flag" "fmt" "github.com/axgle/mahonia" "github.com/xuri/excelize/v2" "log" "os" "path" "path/filepath" ......
  • 重磅:谷歌发布最强大AI模型【Google Gemini】
    https://www.cnblogs.com/eryueren/p/17901497.html一、前言北京时间2023年12月13日Google发布了最新的GeminiPro模型,并且提供了API访问。一个更好的消息是:GeminiPro可免费使用。赶紧体验起来吧~二、关于GoogleGemini是一款由GoogleAI开发的大型语言模型聊天机......
  • Argo Rollouts BlueGreen 配置
    ArgoRolloutsBlueGreen更新过程1.从稳定状态开始,activeService和PreviewService都指向revision1的ReplicaSet。2.用户通过修改Pod模板(spec.template.spec)来发起更新。3.创建的ReplicaSet的revision2的大小为0。4.PreviewService被修改为指向revision2的Re......
  • go-zero目录结构和说明
    .├──code-of-conduct.md行为准则├──CONTRIBUTING.md贡献指南├──core框架的核心组件│├──bloom布隆过滤器,用于检测一个元素是否在一个集合中│├──breaker熔断器,用于防止过多的请求......
  • 快速探索 Tetragon:基于 eBPF 的安全可观察性和执行工具
    Tetragon是一种灵活的安全可观察性和运行时策略执行工具,可直接使用eBPF应用策略和过滤,从而减少了监控、进程跟踪以及实时执行策略的开销。Tetragon提供了如下功能:监控进程执行监控文件操作监控网络活动执行策略最后一个侧重策略的执行,可以通过发送信号或覆盖系统调用......
  • Win 10 Rust Installtion in D Disk with VSCode
    (只记录了必须要内容,日后完善!)1.rust的安装与环境变量:要提前把下面两个环境变量配置好,这样是为了指定安装路径。否则会默认安装在C盘下。CARGO_HOME:D:\Soft\Language\Rust\.cargoRUSTUP_HOME:D:\Soft\Language\Rust\.rustup然后,在这个:Rust,Get-Start界面上下载rust......
  • google gemini api使用
    title:googlegeminiapi使用banner_img:https://cdn.studyinglover.com/pic/2023/12/334c0c129076533308cbc7e03f8c55be.pngdate:2023-12-1423:15:00tags:-googlegeminigooglegeminiapi使用google最近发布了geminiapi,我之前在我的博客介绍了如何申请,这篇文章来......
  • google gemini api申请
    title:googlegeminiapi申请banner_img:https://cdn.studyinglover.com/pic/2023/12/334c0c129076533308cbc7e03f8c55be.pngdate:2023-12-1422:40:00tags:-踩坑googlegeminiapi申请首先登陆https://ai.google.dev/pricing往下滑,看一看到免费选项,每分钟60词请求......