Скажем, инфраструктура предоставляет настраиваемые сервисы через open class A
, который предоставляет совместно используемый экземпляр для использования следующим образом:
open class A {
public static let shared = A()
open func aService() {}
}
Обычное использование сервиса следующее:
A.shared.aService()
Важное примечание: сам общий экземпляр также используется из кода class A
или связанного кода в Framework.
Допустим, вы хотите настроить службу с помощью наследования, и вы все еще хотите сохранить использование общего экземпляра следующим образом:
override class B: A {
public override func aService() {
super.aService()
}
}
Когда вы, к сожалению, обращаетесь к общему экземпляру, он ссылается на экземпляр class A
, где вы хотите, чтобы он ссылался на экземпляр унаследованного класса.
B.shared.aService() // Failed!: This actually calls A.shared.aService()
Один из способов исправить это сделать конструкцию следующим образом:
class A {
public static var shared = A()
}
Тогда перед любым использованием службы в вашем приложении вы уверены, что измените экземпляр следующим образом:
A.shared = B()
B.shared.aService() // OK! This actually calls B.aService()
Хотя все это работает, я хотел бы сделать его автоматическим c, а не полагаться в начальной строке, которая изменяет общий экземпляр.
Как бы вы это сделали?
[КОД ДЛЯ ВОСПРОИЗВЕДЕНИЯ] , который иллюстрирует цель достижения и помогает вам лучше понять вопрос
open class A {
public static var shared = A()
open func aService() {
print("\(type(of: self)): service (from A)")
}
}
class B: A {
public override func aService() {
super.aService()
print("\(type(of: self)): service (from B)")
}
}
A.shared = B() // Question : How to remove the need to this line, yet achieving the same functionality (and output)
A.shared.aService()
B.shared.aService()
// The output (which is correct) :
//B: service (from A)
//B: service (from B)
//B: service (from A)
//B: service (from B)