大号iskov替代原则是大号在SO大号ID面向对象的设计,尽管拥有这5个原则中比较吓人的名字之一,但实际上很容易将您的头缠起来。
实际上,它是如此简单,您将在大约3分钟内了解它。
What Is It?
简单来说,LSP指出相同超类的对象应该能够彼此交换而不会破坏任何对象。
如果我们有一个猫还有一个狗从一个派生的类动物类,使用动物类应该能够使用猫要么狗并表现正常。
Let's do an example!
即使该定义也不能很好地解释它,所以让我们将其付诸实践。 代码将使一切变得清晰。
以真正的OOP方式,让我们动物超类,还有一个狗和猫 subclass和capture their favorite kinds of food.
public static class Animal {
public String favoriteFood;
public Animal(String favoriteFood) {
this.favoriteFood = favoriteFood;
}
}
public static class Dog extends Animal {
public Dog(String favoriteFood) {
super(favoriteFood);
}
}
public static class Cat extends Animal {
public Cat(String favoriteFood) {
super(favoriteFood);
}
}
现在,我们想制作一种方法,让我们给这些美发师一些零食。 我不想将此方法放在动物类,因为它是我 feeding the animals, not a behavior intrinsic to the animals. So我thing like 狗饲料也许可以理解这一点,但我认为喂狗)更好,不是吗?
让我们创建这个方法并调用它GiveTreatTo:
public static void GiveTreatTo(Animal animal) {
String msg = "You fed the " + animal.getClass().getSimpleName() + " some " + animal.favoriteFood;
System.out.println(msg);
}
看到这里GiveTreatTo需要任何动物作为参数。 自从我们动物构造者分配了动物最喜欢的食物,我们几乎可以一直依赖那里的数据。
这意味着我们不必为每种动物都建立一种方法,即GiveTreatToDog和GiveTreatToCat。 因为我们实现了LSP,所以只有一种方法。 让我们来看看它的作用:
public static void main(String[] args) {
Dog rover = new Dog("bacon");
Cat bingo = new Cat("fish");
GiveTreatTo(rover);
GiveTreatTo(bingo);
}
现在,如果我们正确实现了LSP,则该程序应该可以正常运行。 让我们检查输出:
You gave the Dog some bacon
You gave the Cat some fish
惊人。 该主体的另一个好处是我们可以添加越来越多的动物和GiveTreatTo方法不需要任何修改。
Wrap Up
很吓人吧? 与编程和计算机科学中的许多其他内容一样,该名称也掩盖了其简单性。 现在,到那里去,使您的子类可互换,并感谢Barbara Liskov博士的有用原则。