Ответ
Да, наследование от actor поддерживается, но с важными ограничениями, связанными с изоляцией данных.
Основные правила:
- Подкласс также должен быть объявлен как
actor - Нельзя наследовать actor в
classилиstruct - Переопределяемые методы сохраняют изоляцию актора
Пример наследования:
actor BaseDatabaseActor {
private var connectionCount = 0
func connect() -> Int {
connectionCount += 1
return connectionCount
}
}
actor LoggingDatabaseActor: BaseDatabaseActor {
override func connect() -> Int {
let count = await super.connect() // await требуется для вызова родителя
print("Connection #(count) established")
return count
}
}
Ограничения и рекомендации:
- ❌ Нельзя сделать
nonisolatedoverride изолированного метода - ✅ Можно добавлять новые нефункциональные требования через протоколы
- ⚠️ Наследование акторов усложняет поддержку — предпочтительнее композиция
Альтернатива — протоколы:
protocol DatabaseService {
func connect() async -> Int
}
actor PostgresActor: DatabaseService { /* реализация */ }
actor MySQLActor: DatabaseService { /* реализация */ }
Используйте наследование акторов только когда действительно нужна общая базовая логика с состоянием.