面向对象真的需要继承吗?
发布日期:2021-06-30 18:37:36 浏览次数:2 分类:技术文章

本文共 1250 字,大约阅读时间需要 4 分钟。

一提起面向对象三个关键词就是封装、继承、多态。但这三个东西都是面向对象所必要的吗?本来复合对象可以使用组合进行构造,现在又搞一个继承,那什么时候用组合什么时候用构造?

下面是一位大佬对这个问题的评论,觉得很有意思,故转载~

对象范式的原始概念其实根本不包括类和继承,只有1.程序由对象组成、2.对象之间互相发送消息,协作完成任务

最初世界上第一个面向对象语言是 Simula-67,第二个面向对象语言是 Smalltalk-71。Smalltalk 受到了 Simula-67 的启发,基本出发点相同,但是最大的不同是Smalltalk是通过发消息来实现对象方法调用,而Simula是直接调用目标对象的方法。Bjarne Stroustrup 在博士期间深入研究过 Simula,非常欣赏其思想,C++的面向对象思路直接受其影响,因为调用目标对象的方法来“传递消息”需要事先知道这个对象有哪些方法,因此,定义对象本身有哪些方法的“类”和“继承”的概念,一下超越了对象本身,而对象只不过是类这个模子里造出来的东西,反而不重要。随着C++的大行其道,继承和封装变成了面向对象世界的核心概念,OOP 至此被扭曲为 COP ( Class Oriented Programming,面向类程序设计)。

但是COP这套概念本身是有缺陷的:每个程序员似乎都要先成为领域专家,然后成为领域分类学专家,然后构造一个完整的继承树,然后才能 new 出对象,让程序跑起来。

到了 1990 年代中期,问题已经十分明显。UML 中有一个对象活动图,其描述的就是运行时对象之间相互传递消息的模型。1994 年 Robert C. Martin 在《 Object-Oriented C++ Design Using Booch Method 》中,曾建议面向对象设计从对象活动图入手,而不是从类图入手。而 1995 年出版的经典作品《 Design Patterns 》中,建议优先考虑组合而不是继承,这也是尽人皆知的事情。这些迹象表明,在那个时候,面向对象社区里的思想领袖们,已经意识到“面向类的设计”并不好用。只可惜他们的革命精神还不够,delphi 之父在创建.Net Framework 的时候,曾经不想要继承,在微软内部引起了很大的争议,最后是向市场低头,加上了继承。

2000 年后,工程界明确的提出:“组合比继承重要,而且更灵活”,Go和Rust也许是第一批明确的对这种思路进行回应的语言,他们的对象根本不需要类本身来参与,也能完成对象范式的多态组合。

历史让 C++走上了舞台,历史也终将让 COP 重新回到 OOP 的本来面目。

我不喜欢做选择,同时觉得一个好的设计也不应该让用户去做选择。我喜欢简单的东西,因为简单的东西可以一生二二生三三生万物。

本文转载自极客时间用户“有铭”的评论。如有侵权,请联系删除。

https://time.geekbang.org/column/article/92419

转载地址:https://linjun.blog.csdn.net/article/details/115454802 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android音视频——Libyuv使用实战
下一篇:字符编码看不懂你来打我!(ASCII,Unicode,Utf-8,GB2312…)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月25日 12时43分26秒