java继承---->类的复用
2012-07-26 15:46
218 查看
复用类
类的复用主要有以下的三种方式:组合、继承、代理一、组合:
将现有类型作为新类型底层实现的一部分来复用。在新类中声明要复用的对象的引用。组合技术通常用于在新类中使用现有类的功能而非它的接口。”has-a”的关系二、继承:
组合和继承都是在新的类中放置子对象,组合是显式的这样做,继承则是隐式的这样做。继承是使用现有类,为了某种特殊需要将其特殊化。“is-a”的关系.三、代理:
继承和组合的中庸之道。将一个成员对象置于要构造的类中(就像组合),与此同时在新类中暴露了该类成员所有的方法(就像继承)。举例如下:太空飞船控制模块
public class SpaceShipControls { void up(int velocity) {} void down(int velocity) {} void left(int velocity) {} void right(int velocity) {} void forward(int velocity) {} void back(int velocity) {} void turboBoost() {} }
如果使用继承,假如SpaceShip继承控制模块(如下),但是SpaceShip并不是真正的SpaceShipControls的类型,显得不伦不类。即便它可以forward.
public class SpaceShip extends SpaceShipControls { private String name; public SpaceShip(String name) { this.name = name; } public String toString() { return name; } public static void main(String[] args) { SpaceShip protector = new SpaceShip("NSEA Protector"); protector.forward(100); } }
太空船代理
public class SpaceShipDelegation { private String name; private SpaceShipControls controls = new SpaceShipControls(); public SpaceShipDelegation(String name) { this.name = name; } // Delegated methods: public void back(int velocity) { controls.back(velocity); } public void down(int velocity) { controls.down(velocity); } public void forward(int velocity) { controls.forward(velocity); } public void left(int velocity) { controls.left(velocity); } public void right(int velocity) { controls.right(velocity); } public void turboBoost() { controls.turboBoost(); } public void up(int velocity) { controls.up(velocity); } public static void main(String[] args) { SpaceShipDelegation protector = new SpaceShipDelegation("NSEA Protector"); protector.forward(100); } }
四、结合使用组合和代理
class Plate { Plate(int i) { System.out.println("Plateconstructor"); } } class DinnerPlate extends Plate { DinnerPlate(int i) { super(i); System.out.println("DinnerPlateconstructor"); } } // 器具 class Utensil { Utensil(int i) { System.out.println("Utensilconstructor"); } } // 汤匙 class Spoon extends Utensil { Spoon(int i) { super(i); System.out.println("Spoonconstructor"); } } class Fork extends Utensil { Fork(int i) { super(i); System.out.println("Forkconstructor"); } } class Knife extends Utensil { Knife(int i) { super(i); System.out.println("Knifeconstructor"); } } // A cultural way of doingsomething: class Custom { Custom(int i) { System.out.println("Customconstructor"); } } publicclass PlaceSetting extends Custom { private Spoon sp; private Fork frk; private Knife kn; private DinnerPlate pl; public PlaceSetting(int i) { super(i + 1); sp = new Spoon(i + 2); frk = new Fork(i + 3); kn = new Knife(i + 4); pl = new DinnerPlate(i + 5); System.out.println("PlaceSettingconstructor"); } public static void main(String[] args) { PlaceSetting x = new PlaceSetting(9); } } /* * Output: Customconstructor Utensil constructor Spoon constructor Utensil * constructor Forkconstructor Utensil constructor Knife constructor Plate * constructor DinnerPlateconstructor PlaceSetting constructor */
五、在组合和继承之间选择
“is-a”的关系用继承,“has-a”的关系用组合。class Vehicle { } class Engine { public void start() { } public void rev() { } public void stop() { } } class Wheel { public void inflate(int psi) { } } class Window { public void rollup() { } public void rolldown() { } } class Door{ public Window window = new Window(); public void open() { } public void close() { } } public class Car extends Vehicle { public Engine engine = new Engine(); public Wheel[] wheel = new Wheel[4]; public Doorleft = new Door(), right = new Door(); // 2-door public Car() { for (int i = 0; i < 4; i++) wheel[i] = new Wheel(); } public static void main(String[] args) { Car car = new Car(); car.left.window.rollup(); car.wheel[0].inflate(72); } }
相关文章推荐
- java继承---->类的复用
- java 继承 多态(override->重写(=覆盖)、overload->重载、polymorphism -> 多态)
- Java基础<七>-------抽象、继承、接口
- <EffectiveJava>读书笔记--01继承的使用注意
- 黑马程序员 Java面向对象<二> 继承、多态、接口
- 复习java基础------->继承关系中的方法覆盖和属性隐藏
- java知识点 (继承、对象、复用类、初始化、访问权限控制等)
- <Head first Java>继承与多态_重载与覆盖
- 2015.4.21.09.22_复用_8.29_java复用类-组合和继承_0.01
- <Java中的继承和组合之间的联系和区别>
- [置顶] java基础之【继承--->多态】内存图
- 黑马程序员<java基础<面向对象(封装,继承,多态,抽象)>>
- java知识点 (继承、对象、复用类、初始化、访问权限控制等)
- java基础<面向对象>总结(函数、封装、继承、多态)
- Java 面向对象的三大特征:继承、封装【隐藏】、多态<为了适应需求的多种变化,使代码变得更加通用>
- 《黑马程序员》java笔记->【03】关于继承与覆盖
- java 从零开始,学习笔记之基础入门<重载_覆盖_继承>(十)
- Java Base —— 复用类(继承)
- JAVA复用的类继承和对象的组合
- java中复用技术(继承和组合)