当前位置:网站首页>优先使用组合而不使用继承
优先使用组合而不使用继承
2022-04-23 19:12:00 【如来神掌十八式】
Java是一个面向对象的语言。封装、继承、多态是面向对象的三个特征。不管是学习还是工作的时候可能在需要复用的情况下,第一个想到的词汇就是:继承。但是其实在设计模式中,发现组合是一种很好复用方式,它适用于大部分我们需要复用的情况,所以优先使用组合而不使用继承。
继承
继承(Inheritance)是一种联结类与类的层次模型。指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;继承是一种is-a关系。(图片来自网络,侵删。)

组合
组合(Composition)是一种较弱的关系,体现的是整体与部分、拥有的关系,即has-a的关系。

组合和继承的区别
- 在
继承结构中,父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种白盒式代码复用。如果基类的实现发生改变,那么派生类的实现也将随之改变。这样就导致了子类行为的不可预知性;) 组合是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是黑盒式代码复用。(因为组合中一般都定义一个类型,所以在编译期根本不知道具体会调用哪个实现类的方法)继承,在写代码的时候就要指名具体继承哪个类,所以,在编译期就确定了关系。(从基类继承来的实现是无法在运行期动态改变的,因此降低了应用的灵活性。)组合,在写代码的时候可以采用面向接口编程。所以,类的组合关系一般在运行期确定。
优缺点对比
| 组 合 关 系 | 继 承 关 系 |
|---|---|
| 优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立 | 缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性 |
| 优点:具有较好的可扩展性 | 缺点:支持扩展,但是往往以增加系统结构的复杂度为代价 |
| 优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象 | 缺点:不支持动态继承。在运行时,子类无法选择不同的父类 |
| 优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口 | 缺点:子类不能改变父类的接口 |
| 缺点:整体类不能自动获得和局部类同样的接口 | 优点:子类能自动继承父类的接口 |
| 缺点:创建整体类的对象时,需要创建所有局部类的对象 | 优点:创建子类的对象时,无须创建父类的对象 |
总结
为何组合优先于继承,或者说多用组合少用继承,因为组合确实比继承更加灵活,也更有助于代码维护。那么继承是否就一无是处,也不见得。
在面向对象的程序设计中,创建和使用代码最可能采取的一种做法是:将数据和方法统一封装到一个类里,并且使用那个类的对象。有些时候,需通过“合成”技术用现成的类来构造新类。而继承是最少见的一种做法。因此,尽管继承在学习OOP的过程中得到了大量的强调,但并不意味着应该尽可能地到处使用它。相反,使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下,才可考虑它。为判断自己到底应该选用合成还是继承,一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯,就需要继承。但如果不需要上溯造型,就应提醒自己防止继承的滥用。
版权声明
本文为[如来神掌十八式]所创,转载请带上原文链接,感谢
https://blog.csdn.net/t194978/article/details/124362231
边栏推荐
- Yyds dry goods inventory stringprep --- Internet string preparation
- The corresponding permissions required to automatically open the app in the setting interface through accessibility service
- SSDB Foundation
- Openlayers 5.0 loading ArcGIS Server slice service
- mysql_linux版本的下载及安装详解
- Solve the problem of invalid listview Click
- From technical system to business insight, the closing chapter of the practice of small and medium-sized R & D team structure
- [advanced level 11 of C language -- character and string functions and their simulation implementation (2)]
- 简化路径(力扣71)
- Simple use of viewbinding
猜你喜欢

I just want to leave a note for myself

2022.04.23(LC_714_买卖股票的最佳时机含手续费)

mysql_linux版本的下载及安装详解

ArcMap connecting ArcGIS Server

MySQL Téléchargement et installation de la version Linux

Openharmony open source developer growth plan, looking for new open source forces that change the world!

【历史上的今天】4 月 23 日:YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生

Esp32 (UART 485 communication) - 485 communication of serial port (3)

MySQL学习第五弹——事务及其操作特性详解

2022.04.23 (the best time for lc_714_to buy and sell stocks, including handling charges)
随机推荐
Redis optimization series (III) solve common problems after master-slave configuration
Keysight has chosen what equipment to buy for you
js获取本机ip地址
Raspberry pie 18b20 temperature
js上传文件时控制文件类型和大小
Get a list of recent apps
Circuit on-line simulation
RPM包管理
openlayers 5.0 加载arcgis server 切片服务
The fifth bullet of MySQL learning -- detailed explanation of transaction and its operation characteristics
JS to get the local IP address
【历史上的今天】4 月 23 日:YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生
Is it safe to open an account in Bohai futures.
C1000k TCP connection upper limit test
openlayers 5.0 两种居中方式
Using bafayun to control the computer
Convert string to JSON
【玩转Lighthouse】腾讯云轻量服务器搭建全平台视频解析视频下载网站
Screenshot using projectmediamanager
7、 DOM (Part 2) - chapter after class exercises and answers