如何LSP(里氏替换原则)的作品

问题描述 投票:-3回答:2

该LSP(里氏替换原则)指出:原则定义了超类对象应当不会破坏应用程序是可更换的,其子类的对象。

E.g:

Vehicle BMW = new Car();

如何上述声明的作品,在存储层(它是如何工作)?类“汽车”的建立是为了满足特定行为车内有,但一般车辆缺乏。

怎一个“宝马”的对象被称为车辆类?

java object parent substitution
2个回答
0
投票

LSP,简单地说,是在问候你使用的变量和引用的可替代性。一个常见的例子是与所述集合API:

ArrayList<String> someList = new ArrayList<>();

这是正常的,但假设我们有一个列表的方法:

public void printList(LinkedList<String> printedList) { ... }

现在,我们不能通过ArrayList<String>LinkedList<String>参数,它们是不同的类型!然而,我们要求的唯一的实际功能是不LinkedListArrayList的特殊怪癖,但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子类将有颜色的方法,但并非就更加具体的方法说,BMWCar。这是更相关的继承比不过LSP。


0
投票

LSP说,当我们扩展一个类,子类和超类之间的关系必须是A.在您的例子,汽车是车辆。因此,当汽车类扩展了汽车,就没有违反LSP的。

在存储器级,一个汽车对象被创建,其由车辆称作。和宝马参考将能够访问所有的公共和保护的方法,车辆的实例变量。

© www.soinside.com 2019 - 2024. All rights reserved.