Ответ
Используйте модификатор final для полного или частичного запрета наследования.
1. Запрет наследования всего класса:
final class NetworkManager {
// Этот класс нельзя наследовать
func fetchData() { /* ... */ }
}
// Ошибка компиляции:
// 'NetworkManager' cannot be inherited from
class CustomNetworkManager: NetworkManager {}
2. Запрет переопределения отдельных методов:
class PaymentProcessor {
// Базовый метод можно переопределять
func process() { print("Base processing") }
// Этот метод нельзя переопределить
final func validate() { print("Validation logic") }
}
class PayPalProcessor: PaymentProcessor {
override func process() { print("PayPal processing") } // ✓ OK
// Ошибка: Instance method overrides a 'final' instance method
override func validate() { print("Custom validation") } // ✗ ERROR
}
Преимущества использования final:
| Преимущество | Описание |
|---|---|
| Оптимизация производительности | Компилятор может применять devirtualization, заменяя динамическую диспетчеризацию статическими вызовами |
| Защита архитектуры | Предотвращает нарушение инвариантов класса через некорректное наследование |
| Упрощение рефакторинга | Изменения в final классе не ломают код наследников |
| Улучшение компиляции | Уменьшает время компиляции за счет меньшего анализа наследования |
Когда использовать:
- Классы-утилиты (
FileManager,DateFormatter) - Классы с критической бизнес-логикой
- Классы, реализующие определенный протокол без необходимости вариаций
- Классы в performance-critical коде