Sobes.tech
Junior — Middle

Puoi fare un esempio di una situazione in cui si applica il principio di Liskov per sostituire un tipo con un altro senza violare la logica del programma?

sobes.tech AI

Risposta dell'AI

Принцип подстановки Лисков (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 там, где нужен полёт, не нарушая принцип Лисков.