为什么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. iOS程序入口结构

    盛年不重来,一日难再晨.及时宜自勉,岁月不待人. 1. 程序入口   在我们开始开发app的时候,第一步往往是通过设置AppDelegate.m的代理方法开始写一些启动的东西,然后再通过控制器View ...

  2. 3. Shell 条件判断

    重点: 条件测试. read. Shell 环境配置. case. for. find. xargs. gzip,bzip2,xz. tar. sed. 1)Shell 的配置文件 Bash Shel ...

  3. HDU 4787 GRE Revenge

    Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. At each day, ...

  4. smm整合

    配置整合 这个里面SpringConfig 就是书写Spring的配置类,其中加载了jdbc配置类和mybatis配置类,还加载了jdbc资源类. package com.itheima.config ...

  5. 使用动画曲线编辑器打造炫酷的3D可视化ACE

    前言 在制作3D可视化看板时,除了精细的模型结构外,炫酷的动画效果也是必不可少的.无论是复杂的还是简单的动画效果,要实现100%的自然平滑都是具有挑战性的工作.这涉及到物理引擎的计算和对动画效果的数学 ...

  6. 数据库同步工具,PanguSync后起之秀

    随着数字化时代的快速发展,数据已经成为企业运营的核心.为了确保数据的准确性和一致性,数据库同步工具成为了企业不可或缺的工具.而在众多数据库同步工具中,PanguSync以其卓越的性能和强大的功能,逐渐 ...

  7. libgdx摄像头的移动

    要知道,做一个游戏,摄像头是必不可少的.接下来,我将讲解libgdx里面摄像头的移动 2d摄像头OrthographicCamera也叫做正交相机 结果展示: 按上下左右是可以移动的 Orthogra ...

  8. GPT Zero 是什么?

    from https://openaigptguide.com/gptzero/ 在人工智能技术飞速发展的今天,人们对于文字内容的准确性和可信度要求越来越高.例如在学术研究领域,防止抄袭和造假是非常重 ...

  9. 记一次uboot编译/经验/教训

    记一次uboot编译/经验/教训 - 最近学习uboot移植有关的知识,在了解原理后自己编译uboot,但是出现了好多各式各样的错误,最后换了几次系统环境之后才找到错误来源 1.准备源码与交叉编译工具 ...

  10. 常见的Java中SQL注解的用法

    @Select:用于查询操作,标注在方法上,指定相应的SQL查询语句. @Select("SELECT * FROM table_name WHERE condition") Li ...