当前位置:网站首页>优先使用组合而不使用继承
优先使用组合而不使用继承
2022-04-23 19:12:00 【如来神掌十八式】
Java是一个面向对象的语言。封装、继承、多态是面向对象的三个特征。不管是学习还是工作的时候可能在需要复用的情况下,第一个想到的词汇就是:继承。但是其实在设计模式中,发现组合是一种很好复用方式,它适用于大部分我们需要复用的情况,所以优先使用组合而不使用继承。
继承
继承(Inheritance)是一种联结类与类的层次模型。指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;继承是一种is-a关系。(图片来自网络,侵删。)
组合
组合(Composition)是一种较弱的关系,体现的是整体与部分、拥有的关系,即has-a的关系。
组合和继承的区别
- 在
继承结构
中,父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种白盒式代码复用。如果基类的实现发生改变,那么派生类的实现也将随之改变。这样就导致了子类行为的不可预知性;) 组合
是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是黑盒式代码复用。(因为组合中一般都定义一个类型,所以在编译期根本不知道具体会调用哪个实现类的方法)继承
,在写代码的时候就要指名具体继承哪个类,所以,在编译期
就确定了关系。(从基类继承来的实现是无法在运行期动态改变的,因此降低了应用的灵活性。)组合
,在写代码的时候可以采用面向接口编程。所以,类的组合关系一般在运行期
确定。
优缺点对比
组 合 关 系 | 继 承 关 系 |
---|---|
优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立 | 缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性 |
优点:具有较好的可扩展性 | 缺点:支持扩展,但是往往以增加系统结构的复杂度为代价 |
优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象 | 缺点:不支持动态继承。在运行时,子类无法选择不同的父类 |
优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口 | 缺点:子类不能改变父类的接口 |
缺点:整体类不能自动获得和局部类同样的接口 | 优点:子类能自动继承父类的接口 |
缺点:创建整体类的对象时,需要创建所有局部类的对象 | 优点:创建子类的对象时,无须创建父类的对象 |
总结
为何组合优先于继承,或者说多用组合少用继承,因为组合确实比继承更加灵活,也更有助于代码维护。那么继承是否就一无是处,也不见得。
在面向对象的程序设计中,创建和使用代码最可能采取的一种做法是:将数据和方法统一封装到一个类里,并且使用那个类的对象。有些时候,需通过“合成”技术用现成的类来构造新类。而继承是最少见的一种做法。因此,尽管继承在学习OOP的过程中得到了大量的强调,但并不意味着应该尽可能地到处使用它。相反,使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下,才可考虑它。为判断自己到底应该选用合成还是继承,一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯,就需要继承。但如果不需要上溯造型,就应提醒自己防止继承的滥用。
版权声明
本文为[如来神掌十八式]所创,转载请带上原文链接,感谢
https://blog.csdn.net/t194978/article/details/124362231
边栏推荐
- SSDB foundation 3
- openlayers 5.0 离散聚合点
- Customize the non slidable viewpage and how to use it
- Screenshot using projectmediamanager
- [报告] Microsoft :Application of deep learning methods in speech enhancement
- Class loading process of JVM
- Modify the font size of hint in editext
- ArcMap连接 arcgis server
- 2022.04.23 (the best time for lc_714_to buy and sell stocks, including handling charges)
- Yyds dry goods inventory stringprep --- Internet string preparation
猜你喜欢
Esp32 (UART receiving and sending) - receiving and sending communication of serial port (4)
C: generic reflection
2022.04.23 (lc_763_divided into letter interval)
Openharmony open source developer growth plan, looking for new open source forces that change the world!
微搭低代码零基础入门课(第三课)
Oracle configuration st_ geometry
Raspberry pie uses root operation, and the graphical interface uses its own file manager
为何PostgreSQL即将超越SQL Server?
Esp32 (UART ecoh) - serial port echo worm learning (2)
ArcMap publishing slicing service
随机推荐
该买什么设备,Keysight 给你挑好了
微搭低代码零基础入门课(第三课)
腾讯云GPU最佳实践-使用jupyter pycharm远程开发训练
Simple use of navigation in jetpack
Feature selection feature_ selection--SelectKBest
Esp32 (UART event) - serial port event learning (1)
Circuit on-line simulation
openlayers draw矩形
#yyds干货盘点#stringprep --- 因特网字符串预备
Accessing private members using templates
坐标转换WGS-84 转 GCJ-02 和 GCJ-02转WGS-84
从技术体系到商业洞察,中小研发团队架构实践之收尾篇
Keysight has chosen what equipment to buy for you
Sword finger offer II 116 Number of provinces - spatial complexity O (n), time complexity O (n)
Using 8266 as serial port debugging tool
ESP32 LVGL8. 1 - msgbox message box (msgbox 28)
Screenshot using projectmediamanager
binlog2sql 工具安装使用及问题汇总
Recyclerview control list item layout match_ Fundamental principle of parent attribute invalidation
Client interns of a large factory share their experience face to face