Sobes.tech
Junior — Middle

Kas saaksid anda näite olukorrast, kus rakendatakse Liskovi põhimõtet, et asendada üks tüüp teisega ilma programmi loogikat rikkumata?

sobes.tech AI

Vastus AI-lt

Принцип подстановки Лисков (Liskov Substitution Principle) говорит, что объекты подкласса должны быть взаимозаменяемы с объектами базового класса без нарушения логики программы.

Пример из iOS: есть базовый класс Bird с методом fly(). Если мы создадим подкласс Penguin, который не умеет летать, то замена Bird на Penguin нарушит логику, если где-то вызывается fly().

Правильный подход — выделить интерфейс или базовый класс для летающих птиц, например FlyingBird, и реализовать fly() только там. Тогда Penguin будет наследоваться от Bird, но не от FlyingBird. Это позволит заменить объекты FlyingBird на подклассы без нарушения логики.

class Bird {
  func eat() {
    print("Птица ест")
  }
}

protocol FlyingBird {
  func fly()
}

class Sparrow: Bird, FlyingBird {
  func fly() {
    print("Воробей летит")
  }
}

class Penguin: Bird {
  // Пингвин не летает, fly() не реализует
}

Так можно безопасно использовать объекты FlyingBird там, где нужен полёт, не нарушая принцип Лисков.