为什么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 蒙古; }
}

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

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

为什么 Go 和 Rust 语言都舍弃了继承?的更多相关文章

  1. 5分钟APIG实战: 使用Rust语言快速构建API能力开放

    序言:Rust语言简介 参与过C/C++大型项目的同学可能都经历过因为Null Pointer.Memory Leak等问题“被” 加班了不知道多少个晚上.别沮丧,你不是一个人,Mozilla Fir ...

  2. Rust语言:安全地并发

    http://www.csdn.net/article/2014-02-26/2818556-Rust http://www.zhihu.com/question/20032903 Rust是近两年M ...

  3. D、GO、Rust 谁会在未来取代 C?为什么?——Go语言的定位非常好,Rust语言非常优秀,D语言也不错

    不要管我的地位和 D 语言创造者之一的身份.我会坦诚的回答这个问题.我熟悉 Go 和 Rust,并且知道 D 的缺点在哪里.我鼓励人们在 Rust 和 Go 社区相似身份的人,也可以提出他们诚恳的观点 ...

  4. 【转】对 Rust 语言的分析

    对 Rust 语言的分析 Rust 是一门最近比较热的语言,有很多人问过我对 Rust 的看法.由于我本人是一个语言专家,实现过几乎所有的语言特性,所以我不认为任何一种语言是新的.任何“新语言”对我来 ...

  5. 半个月使用rust语言的体验

    从第一次下载rust语言的编译器到今天刚好第14天. 简单说一下对这个语言的感觉吧. 一.性能 把以前用java写的一个中文地址切分的算法,用rust重新实现了一下(https://github.co ...

  6. 我持续推动Rust语言支持Windows XP系统

    前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发人员明白的拒绝了.他们的对话大致上是以这种形式開始和结束的(当中乙方代表官方及其拥趸 ...

  7. 微软看上的Rust 语言,安全性真的很可靠吗

    摘要:近几年,Rust语言以极快的增长速度获得了大量关注.其特点是在保证高安全性的同时,获得不输C/C++的性能.在Rust被很多项目使用以后,其实际安全性表现到底如何呢? 近几年,Rust语言以极快 ...

  8. Rust语言开发

    Rust开发 第一个程序 fn main() { println!("Hello, world!"); // 带!号的都是宏 并不是函数 } fn main() { let nam ...

  9. Apache Dubbo 多语言体系再添新员:首个 Rust 语言版本正式发布

    Dubbo Rust 定位为 Dubbo 多语言体系的重要实现,提供高性能.易用.可扩展的 RPC 框架,同时通过接入 Dubbo Mesh 体系提供丰富的服务治理能力.本文主要为大家介绍 Dubbo ...

  10. Rust语言之HelloWorld Web版

    Rust语言之HelloWorld Web版 下面这篇文章值得仔细研读: http://arthurtw.github.io/2014/12/21/rust-anti-sloppy-programmi ...

随机推荐

  1. 聊聊分布式 SQL 数据库Doris(四)

    FE层的架构都能在网上找到说明. 但BE层的架构模式.一致性保障.与FE层之间的请求逻辑,数据传输逻辑等,我个人暂时没有找到相应的博客说明这些的.当然这些是我个人在学习与使用Doris过程中,对内部交 ...

  2. .net 温故知新【13】:Asp.Net Core WebAPI 缓存

    一.缓存 缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快. 从概念上讲,缓存是一种性能优化策略和设计考虑因素. 缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性. ...

  3. 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇

    首先,让我来介绍一下今天的主题.今天我们将讨论封装.反射以及单例模式.除此之外,我们不再深入其他内容.关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符.而对于反 ...

  4. OpenSSL 使用AES对文件加解密

    AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密算法之一.AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,它取代了原先 ...

  5. 初探webpack之单应用多端构建

    初探webpack之单应用多端构建 在现代化前端开发中,我们可以借助构建工具来简化很多工作,单应用多端构建就是其中应用比较广泛的方案,webpack中提供了loader与plugin来给予开发者非常大 ...

  6. ssm整合-项目异常处理方案

    项目异常分类: 项目异常处理方案: 需要自定义异常处理 然后在处理器中加入 package com.itheima.controller; import com.itheima.exception.B ...

  7. 开源 Serverless 框架 Laf 性能优化实践

    介绍 Laf 是一个完全开源的 Serverless 框架,Laf 的 Node.js 运行时容器 (以下简称为 Runtime) 是 Laf 的函数执行环境,依托于 Express.js 框架.采用 ...

  8. 【Python】【OpenCV】绘制外接矩形、外接圆

    外接矩形.外接圆: 1 import cv2 2 import numpy 3 4 img = cv2.imread('../img/img.png', -1) 5 ret, thresh = cv2 ...

  9. Python+Selenium4自动化之JS属性

    应用场景 在自动化中, 能对JS代码进行增.删.改的话,可以帮助我们解决很多问题, 如:修改<a>标签的target属性,让它不打开新的窗口(_blank),从而不用频繁使用switch_ ...

  10. Codeforces 918(div4)

    Codeforces 918(div4) Problem - A - Codeforces #include<bits/stdc++.h> using namespace std; con ...