public разрешает использовать тип снаружи модуля, но запрещает subclass/override снаружи; open разрешает и использование, и наследование/override из другого модуля.
Разбор
open — только class hierarchy.
- Для библиотечного API чаще
public final class или public struct.
open усложняет эволюцию ABI — больше обязательств.
- Внутри приложения почти всегда достаточно
internal/public.
Итог
open — сознательное разрешение внешнего наследования; по умолчанию ужесточайте.