首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么说组合优于继承?

在编程中,继承和组合是用于在面向对象语言中设计和构建类和对象的两种基本技术。继承,它允许一个类(称为派生类或子类)从另一个类(称为基类或超类)继承属性和行为。换句话说,子类“是”超类的一种类型。...例如,如果我们有一个类“Animal”和一个类“Dog”,则“Dog”类继承自“Animal”,因为狗是一种动物。组合,涉及使用其他对象作为组件来构建对象。...优势劣势相关设计模式继承(1)允许子类从超类继承属性和方法来促进代码重用。(2)有助于在单个继承树下组织和抽象相关类。(3)通过遵循清晰的层次结构来简化对类结构的理解。...如果我们使用继承来表示汽车和发动机的关系,可能会定义一个“汽车”类,然后定义一个“电动汽车”类继承自“汽车”类,并添加与电池和电机相关的属性和方法。...为什么Go、Rust等新兴语言舍弃了继承特性Go和Rust等新兴语言选择不直接支持传统面向对象编程(OOP)中的继承特性,而是采用了其他机制来实现代码复用和扩展性,这主要是基于以下几个原因:简洁性:Go

47230

为什么要用自增主键?

我觉得设置自增主键的最主要目的是:应对变化。 笔者遇到的场景为:维护商业账号的资质相关信息。账号是由全局唯一且自增的分布式ID生成器生成的,很显然这个时候我们把账号作为主键这就天然合理。...如果我们一开始设计表的时候,就用业务无关的ID作为自增主键,那么本次升级就不会变得这么麻烦。...性能考量 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。...如果不是自增主键,那么可能会在中间插入,学过数据结构的同学都知道,在中间插入,B+树为了维持平衡,引起B+树的节点分裂。总的来说用自增主键是可以提高查询和插入的性能。...自增ID可以用来做分页优化。当然这是另一个话题了,下次分析。

4.3K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java中为什么要使用单继承而不是多继承?

    多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量...(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。...正因为有以上的致命缺点,所以java中禁止一个类继承多个父类; 在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。...对于一个接口继承多个父接口的情况也一样不存在这些缺点。...总结: java中为什么要单继承,多实现,总结如下: 若为多继承,那么当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清,因此用了单继承。 为什么是多实现呢?

    1.7K10

    Go:组合与继承,为什么选择组合?

    在这篇文章中,我们将专注于Go语言中的一种重要特性:使用组合而不是继承。我们将探讨这种设计的背景和优点,并对比组合和继承的差异。 Go语言的设计哲学 Go语言的设计理念强调简洁性和可用性。...继承的问题 继承是面向对象编程中的一个核心概念,它允许我们定义一个类(子类)来继承另一个类(父类)的特性。然而,继承也带来了一些问题。...首先,过度使用继承会导致代码结构复杂化,这会使代码的维护和理解变得困难。例如,深层次的继承树和多重继承都可能引发问题。 其次,继承违反了封装原则,因为子类可以访问父类的保护字段和方法。...最后,继承通常是在编译时确定的,这限制了程序的灵活性。例如,我们不能在运行时改变一个对象的类。 组合的优点 相对于继承,组合提供了一个更为灵活、强大的代码复用机制。...尽管组合不能完全替代继承,在所有的场景下,但在许多情况下,组合是一个优于继承的选择。

    78540

    MySQL自增主键为什么不连续

    自增主键可以让主键索引尽量的保持递增顺序插入,避免页分裂,索引更加紧凑。 自增主键保存在何处?...不同的引擎对于自增值的保存策略不同: MyISAM引擎的自增值保存在数据文件中 InnoDB引擎的自增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,自增值没有持久化每次重启后第一次打开表的时候...自增值的变更情况如下,假设某次要插入的值是X,当前的自增值是Y: 如果X自增值不变 如果X>=Y,需要把当前自增值修改为新的自增值 新的自增值生成算法 从auto_increment_offset...事务回滚为什么自增值不能回退 两个并行的事务在申请自增值的时候,为了避免两个事务申请到相同的自增id,需要加锁按照顺序申请,如果自增值可以回退需要做一些特殊处理: 每次申请id之前,判断表里此id是否存在...批量插入导致自增值不连续 自增值锁不是一个事务锁,每次申请完就释放,方便其他事务获取自增值。

    8.4K20

    mysql为什么建议使用自增主键

    我们都知道表的主键一般都要使用自增 id,不建议使用业务 id ,是因为使用自增 id 可以避免页分裂。这个其实可以相当于一个结论,你都可以直接记住这个结论就可以了。...如果主键为自增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。...如果主键是非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...本来这篇文章是打算总结一下前面写的几篇关于 mysql 索引的文章的,也是打算多举几个例子的,结果发现光写了一个自增主键就写了一大堆了,然后时间也比较晚了,干脆就写到这吧,原本计划的几个其他例子后面再单独写吧

    5K31

    苹果自研 CPU为什么这么强?

    苹果是因为什么样的勇气,让自研CPU这么强? “捅破天”的A16仿生处理器 苹果每年9月都会举办新品发布会,最亮眼的便是最新iPhone系列发布。...本质上,苹果 M1 系列 CPU 与 Intel 酷睿系列和AMD 的 Zen3 系列,构架上高度类似,但为什么 M1 会强那么多?...而前一代处理器 M1 在能耗表现上为什么那么出色,一是 M 系列处理器不计成本的堆料,从而获得了超级性能,二是在指令翻译过程中利用格式统一的优点节省了大量能耗。 苹果处理器为什么敢不计成本地堆料?...为什么苹果敢做这么贵的 CPU ?本质是因为苹果卖整机而不卖 CPU。...当前的苹果自研CPU是根据自身需求高度定制化的,其他厂商已经全都不能满足苹果的要求了。而自研的处理器从 2020 年量产后,就马上应用到苹果几乎全部的主力产品。

    1.5K20

    MySQL主键自增值为什么有“空洞”?

    同时插入指定值大于自增值时,自增值也会随之改变。...--------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) 那么,为什么会出现插入数据未成功...5,当插入数据时,自增值就会插入5的值并且把自增值加1,问题就出现了,此时自增值再进行插入就违背了唯一的原则了 4.问题拓展 在生产环境中还存在很多类似的问题,如: # 目前的插入值为8,自增值为9 mysql...“空洞”,那么问题又来了,为什么在插入数据的时候发生了回滚,数据回滚了,自增值却没有回滚呢?...space_collection&business_id=343928&desc=0 ---- 文章推荐: MySQL 8.0有趣的新特性:CHECK约束 MySQL 启停过程了解一二 技术分享 | 微服务架构的数据库为什么喜欢分库分表

    2.3K20

    为什么 Java 不支持类多重继承?

    这是非常经典的问题,与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。...为什么Java不支持类多重继承, 可以考虑以下两点: 1、 第一个原因围绕钻石?...形继承问题产生的歧义 考虑一个类 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 实现,现在 D 类使用多个继承派生自 B 和 C。...如果你把这个理由告诉面试官,他会问为什么 C++ 可以支持多重继承而 Java不行。...2、对我来说第二个也是更有说服力的理由是,多重继承确实使设计复杂化并在强制转换、构造函数链接等过程中产生问题。 假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。

    72130

    为什么我不建议自研BI系统?

    然而,自研还是外采,是他们面临的第一道选择题。 当企业考虑自研还是外采时,应该权衡些什么? 从企业层面来说,选择自研还是外采,其实要算的是一笔经济账。...成本层面: 人力成本:自研需要企业组建专门的团队,投入一定的开发资源,程序员的工资是明面上要计算的帐。...试错成本:自研会有一个摸索的周期,而且如果自研出来的BI系统不好用,来回折腾也会有人力和时间成本的损耗,这是企业要算的一笔“暗账”。...最容易陷入纠结的是处于上述两者之间的互联网企业,一般会在自研和外采之间左右摇摆,甚至来回试水,不过大部分最终还是选择了外采。 从自研到外采,第三方BI系统何以脱颖而出?...他们先前也自研过一些数据产品,主要是数据埋点方向,但是在引入BI的时候还是选择了外采。他们数据部门的负责人告诉我们,BI产品的自研门槛是比较高的。

    75920

    【Java基础】 为什么Java不支持多继承

    多继承是为了保证子类能够复用不同父类的方法,使用多继承会产生存在菱形继承的问题。C++使用虚继承的方式解决菱形继承问题。在现实生活中,我们真正想要使用多继承的情况并不多。...扩展知识菱形继承问题假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C。...doSomething(); // 明确调用B中的doSomething d.C::doSomething(); // 明确调用C中的doSomething return 0;}在上面的代码中,类D继承自类...C++为了解决菱形继承问题,又引入了虚继承。在C++中,虚继承是解决菱形问题(或钻石继承问题)的机制。通过虚继承,可以确保被多个类继承的基类只有一个共享的实例。...因为支持多继承,引入了菱形继承问题,又因为要解决菱形继承问题,引入了虚继承。而经过分析,人们发现我们其实真正想要使用多继承的情况并不多。

    15610

    为什么一个类不能随意被继承?

    这个解释对于了解"继承"的小伙伴来说,显得理所当然。 但实际情况是:不是因为有了“继承”特性,里氏替换才有意义;而是因为有了里氏替换原则,才规范了“继承”特性的使用。 PS:小二哥可能表述得有点怪。...有了抽象,我们就可以基于抽象写一些具体的实现类了--这就是基类(父类)和派生类(子类)的继承关系。 好啦!问题来啦~ 请问“这个继承关系可以随便使用吗?”...小伙伴们,肯定就会说啦:Cat 和 Dog 是两种动物了,肯定不能使用继承关系啦~ 这个说法是对的。但对于我们面向对象编程过程中,尤其是在“继承”关系中,我们考虑的是“替换性”。...PS:大家可以上网搜一下这个例子,小二哥这里就不啰嗦啦~ 总结 由之前的例子可知,我们可以用里氏替换原则来规范继承关系的实现是否合理。 如果子类可以替换它的父类,那么这个继承关系就是的。...为什么里氏代换原则这么重要,小伙伴们理解了吗?

    20920

    【Java基础】 为什么Java不支持多继承

    多继承是为了保证子类能够复用不同父类的方法,使用多继承会产生存在菱形继承的问题。C++使用虚继承的方式解决菱形继承问题。在现实生活中,我们真正想要使用多继承的情况并不多。...扩展知识菱形继承问题假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C。...doSomething(); // 明确调用B中的doSomething d.C::doSomething(); // 明确调用C中的doSomething return 0;}在上面的代码中,类D继承自类...C++为了解决菱形继承问题,又引入了虚继承。在C++中,虚继承是解决菱形问题(或钻石继承问题)的机制。通过虚继承,可以确保被多个类继承的基类只有一个共享的实例。...因为支持多继承,引入了菱形继承问题,又因为要解决菱形继承问题,引入了虚继承。而经过分析,人们发现我们其实真正想要使用多继承的情况并不多。

    15110
    领券