Можно ли в Swift эмулировать поведение модификатора open без его использования?

«Можно ли в Swift эмулировать поведение модификатора open без его использования?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, но с ограничениями. Модификатор open позволяет наследовать класс и переопределять его методы за пределами модуля. Полной замены нет, но можно использовать обходные пути.

Основные ограничения public (альтернативы open):

  • public class — нельзя наследовать вне модуля.
  • public метод — нельзя переопределить вне модуля.

Способы эмуляции:

  1. Использование протоколов: Определите публичный протокол с требуемым интерфейсом. Внешний код может предоставить свою реализацию.
    // Внутри модуля:
    public protocol ServiceProtocol {
        func execute()
    }
    public class MyModule {
        public let service: ServiceProtocol
        public init(service: ServiceProtocol) {
            self.service = service // Внешняя реализация
        }
    }
  2. Наследование внутри модуля: Создайте публичный подкласс внутри модуля, который затем можно использовать извне.
    // Внутри модуля:
    public class Base { /* public методы */ }
    public class BaseOpen: Base { } // Публичный наследник для внешнего использования

Вывод: Полноценной семантической замены open не существует. Эти подходы лишь частично решают задачу, жертвуя прямым наследованием.