news 2026/7/26 18:08:57

组合优于继承,多用组合少用继承

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
组合优于继承,多用组合少用继承

为什么不推荐使用继承?

继承是面向对象的四大特性之一,用来表示类之间的is-a关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。所以,对于是否应该在项目中使用继承,网上有很多争议。很多人觉得继承是一种反模式,应该尽量少用,甚至不用。为什么会有这样的争议?我们通过一个例子来解释一下。

假设我们要设计一个关于鸟的类。我们将“鸟类”这样一个抽象的事物概念,定义为一个抽象类AbstractBird。所有更细分的鸟,比如麻雀、鸽子、乌鸦等,都继承这个抽象类。

我们知道,大部分鸟都会飞,那我们可不可以在AbstractBird抽象类中,定义一个fly()方法呢?答案是否定的。尽管大部分鸟都会飞,但也有特例,比如鸵鸟就不会飞。鸵鸟继承具有fly()方法的父类,那鸵鸟就具有“飞”这样的行为,这显然不符合我们对现实世界中事物的认识。当然,你可能会说,我在鸵鸟这个子类中重写(override)fly()方法,让它抛出UnSupportedMethodException异常不就可以了吗?具体的代码实现如下所示:

public class AbstractBird { //...省略其他属性和方法... public void fly() { //... } } public class Ostrich extends AbstractBird { //鸵鸟 //...省略其他属性和方法... public void fly() { throw new UnSupportedMethodException("I can't fly.'"); } }

这种设计思路虽然可以解决问题,但不够优美。因为除了鸵鸟之外,不会飞的鸟还有很多,比如企鹅。对于这些不会飞的鸟来说,我们都需要重写fly()方法,抛出异常。这样的设计,一方面,徒增了编码的工作量;另一方面,也违背了我们之后要讲的最小知识原则(Least Knowledge Principle,也叫最少知识原则或者迪米特法则),暴露不该暴露的接口给外部,增加了类使用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 14:35:08

Stremio-web源码精读:5000+提交背后的工程实践

Stremio-web源码精读:5000提交背后的工程实践 【免费下载链接】stremio-web Stremio - Freedom to Stream 项目地址: https://gitcode.com/GitHub_Trending/st/stremio-web Stremio-web是一个现代化的流媒体中心项目,拥有超过6000次提交记录&…

作者头像 李华
网站建设 2026/7/14 14:35:10

经营业绩领跑行业!中远海控2025年实现归母净利309亿元

3月19日晚,中远海控(601919.SH;1919.HK)披露2025年年度报告。报告期内,面对全球集装箱航运市场供需矛盾阶段性加剧,中远海控锚定“以集装箱航运为核心的全球数字化供应链运营和投资平台”定位,聚…

作者头像 李华
网站建设 2026/7/14 14:35:10

【Calcite 系列】深入理解 Calcite 的 AggregateExpandDistinctAggregatesRule

AggregateExpandDistinctAggregatesRule 是 Calcite 中一条非常核心的聚合展开规则,它主要处理 COUNT(DISTINCT x)、SUM(DISTINCT x) 这类带 DISTINCT 的聚合表达式。由于 DISTINCT 聚合往往不能直接下推到统一的物理实现中,Calcite 会在优化阶段把它改写成更基础的 Aggregat…

作者头像 李华