设计原则[2]
针对接口编程,而不是针对实现编程。
“针对实现编程”
Dog d = new Dog( );
d.bark( );
声明变量“ d ” 为D o g 类型( 是 Animal的具体实现),会造成我们必 须针对具体实现编码。
“针对接口/超类型编程”
Animal animal = new Dog( );
animal.makeSound( );
我们知道该对象是狗,但是我们现在利用animal进行多态的调用。
更棒的是,子类实例化的动作不再需要在代码中硬编码,例如new Dog(),而是“在运行时才指定具体实现的对象”。
a = getAnimal( );
a.makeSound( );
我们不知道实际的子类型是“ 什么”……我们只关心它知道如何正确地进行makeSound()的动作就够了。