В чём разница между open и public

open позволяет другим модулям использовать класс и наследоваться от него. Члены open класса могут быть переопределены (be overridden) другими модулями.

public позволяет другим модулям использовать только public классы, но не может быть подклассом или переопределен другими модулями.

Oct. 14, 2023, Источник

`open` и `public` — это модификаторы доступа, которые определяют, как и где можно использовать классы, методы и свойства. Различие между `open` и `public` важно понимать при проектировании API библиотек и фреймворков, так как оно влияет на возможности наследования и переопределения в модулях и подключаемых пакетах.

Public

Уровень доступа позволяет элементам быть видимыми и доступными вне определённого модуля (библиотеки или фреймворка), в котором они объявлены. Однако он ограничивает возможность наследования классов и переопределения методов в модулях, отличных от того, где класс или метод были первоначально объявлены. То есть, можно использовать `public` классы и методы в любом месте вашего проекта или в других проектах, которые импортируют ваш модуль, но вы не можете создавать подклассы или переопределять `public` методы за пределами их оригинального модуля.

Open

Уровень доступа расширяет `public` возможности, позволяя не только использовать классы и методы вне модуля, но и наследовать классы, а также переопределить методы в подклассах, находящихся вне модуля, где был объявлен оригинальный класс. Он является наиболее гибким уровнем доступа и должен использоваться с осторожностью, так как он предоставляет внешним модулям возможность изменять поведение вашего кода.

Примеры:

```swift
// В модуле A
public class PublicClass {
    public var property: Int = 0
    public func method() {}
}

open class OpenClass {
    open var property: Int = 0
    open func method() {}
}

// В модуле B, который импортирует модуль A
class SubclassOfPublicClass: PublicClass {
    // Это будет ошибка, если попытаться переопределить property или method
}

class SubclassOfOpenClass: OpenClass {
    // Это разрешено: можно переопределить property и method
}
```

Когда использовать

  • `public`, когда хотите разрешить использование классов, методов или свойств вне вашего модуля, но не хотите разрешать их наследование или переопределение.
  • `open`, когда предоставляете API, который специально предназначен для наследования и переопределения в клиентском коде, включая код вне модуля.

Выбор между `open` и `public` влияет на архитектуру и возможности расширения вашего кода. `Open` предоставляет большую гибкость для пользователей вашего API, но требует более тщательного проектирования и документирования, чтобы обеспечить безопасное наследование и переопределение.

April 10, 2024, easyoffer

Примеры ответов: