为什么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. python中的post请求

    用python来验证接口正确性,主要流程有4步: 1 设置url 2 设置消息头 3 设置消息体 4 获取响应 5 解析相应 6 验证数据 Content-Type的格式有四种:分别是applicat ...

  2. 在CPF里使用OpenGL做跨平台桌面应用开发

    CPF 是开源的C#跨平台UI框架,支持使用OpenGL来渲染,可以用来硬件加速播放视频或者显示3D模型 实现原理其实就是Skia用OpenGL后端,Skia里绑定GLView的OpenGL纹理,将纹 ...

  3. [ABC328D] Take ABC 题解

    题目翻译 题目描述 给你一个字符串 \(S\) 包含 A.B 和 C 三个不用的字符. 只要字符串 \(S\) 中包含连续的 ABC 就将 ABC 删除掉 再字符串 \(S\) 不能操作之后输出这个字 ...

  4. [ABC244G] Construct Good Path

    Problem Statement You are given a simple connected undirected graph with $N$ vertices and $M$ edges. ...

  5. @Async实现异步任务

    1.@Async是SpringBoot自带的一个执行步任务注解 @EnableAsync // 开启异步 @SpringBootApplication public class Application ...

  6. SpringBoot使用maven打jar包配置

    在pom.xml文件中加入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactI ...

  7. AVL树和红黑树的Python代码实现

    AVL树 AVL树是一种自平衡二叉搜索树.在这种树中,任何节点的两个子树的高度差被严格控制在1以内.这确保了树的平衡,从而保证了搜索.插入和删除操作的高效性.AVL树是由Georgy Adelson- ...

  8. Scrapyd、scrapyd-client部署爬虫项目

    命令参考:https://github.com/scrapy/scrapyd-client https://scrapyd.readthedocs.io 安装组件 pip install scrapy ...

  9. 【Python】【OpenCV】凸轮廓和Douglas-Peucker算法

    针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作. cv2.arcLength() Meth ...

  10. Guava Cache 异步刷新技巧,你值得拥有!

    Guava Cache是一款非常优秀的本地缓存框架,提供简洁易用的 API 供开发者使用. 这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 . 1 基本用法 首先,在 J ...