9. 实现类复用的两个手段——继承与组合
一、实现类复用概述
1. 如果需要复用一个类,可以把这个类当成基类来继承
- 如果访问权限允许,子类可以直接访问父类的成员变量和方法,相当于子类可以直接复用父类的成员变量和方法
- 继承带来高度复用的同时,也严重地破坏了父类的封装性
- 如果只是出于类复用的目的,并不一定需要使用继承,完全可以使用组合来实现
2. 如果需要复用一个类,还可以把这个类当成新类的组合成分
- 新类可以直接复用这个类的public成员变量和方法
二、实现类复用的补充说明
1. 继承方式中,子类可以直接获得父类的public方法,程序使用子类时,将可以直接访问该子类从父类那里继承到的方法
2. 组合把旧类对象作为新类的成员变量组合进来,用以实现新类的功能
- 用户看到的是新类的方法,而不能看到被组合对象的方法,故通常需要在新类里使用private修饰被组合的旧类对象
补:仅从类复用的角度来看,父类的功能等同于被组合的类,都将自身的方法提供给新类使用。
三、用继承还是组合?
1. 继承要表达的是“是(is-a)”的关系,而组合表达的是“有(has-a)”的关系
- 继承是对已有的类做一番改造,以此获得一个特殊的版本,即将一个较为抽象的类改造成能适用于某些特定需求的类,如Animal类和Wolf类
- 如果两个类之间有明确的整体、部分的关系,此时就应该采用组合关系来实现复用,如Person类复用Arm类时就应使用组合的方式