3分钟内的Liskov替代原理

大号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博士的有用原则。

from: https://dev.to//erikwhiting88/liskov-substitution-principle-in-3-minutes-2dc6

发布了0 篇原创文章 · 获赞 0 · 访问量 642

猜你喜欢

转载自blog.csdn.net/cunxiedian8614/article/details/105691162
今日推荐