该LSP(里氏替换原则)指出:原则定义了超类对象应当不会破坏应用程序是可更换的,其子类的对象。
E.g:
Vehicle BMW = new Car();
如何上述声明的作品,在存储层(它是如何工作)?类“汽车”的建立是为了满足特定行为车内有,但一般车辆缺乏。
怎一个“宝马”的对象被称为车辆类?
LSP,简单地说,是在问候你使用的变量和引用的可替代性。一个常见的例子是与所述集合API:
ArrayList<String> someList = new ArrayList<>();
这是正常的,但假设我们有一个列表的方法:
public void printList(LinkedList<String> printedList) { ... }
现在,我们不能通过ArrayList<String>
到LinkedList<String>
参数,它们是不同的类型!然而,我们要求的唯一的实际功能是不LinkedList
或ArrayList
的特殊怪癖,但List
的本身,而只是特定的功能。因此,我们写那些在可替代的方式:
List<String> someList = new ArrayList<>(); //still an arraylist!
public void printList(List<String> printedList) { ... } //any list type
现在我们可以通过我们的参数,因为我们不会不必要地绑定到我们并不需要的功能的亚型。
在记忆层面上来讲,这些对象仍处于堆内存相同的对象,你简单地把它们作为自己的父(事实上,你可以,如果你知道类型向下转换它们)。
因此,使用你的榜样,你可能有其中存在任何车辆有颜色的情况下。因此,我们有方法:
public class Vehicle {
public Color getColor() { ... }
public void setColor(Color color) { ... }
}
在做这件事,对于任何Vehicle
子类将有颜色的方法,但并非就更加具体的方法说,BMW
或Car
。这是更相关的继承比不过LSP。
LSP说,当我们扩展一个类,子类和超类之间的关系必须是A.在您的例子,汽车是车辆。因此,当汽车类扩展了汽车,就没有违反LSP的。
在存储器级,一个汽车对象被创建,其由车辆称作。和宝马参考将能够访问所有的公共和保护的方法,车辆的实例变量。