请考虑以下课程:
// Models:
class A {}
class B: A { }
class C: B { }
// Cache:
class AbstractCache<T> {}
// Services:
class AbstractService<T> {
let cache = AbstractCache<T>()
}
class ServiceA<T: A>: AbstractService<T> {}
class ServiceB<T: B>: ServiceA<B> {}
class ServiceC<T: C>: ServiceB<C> {}
现在我这样做了:
let serviceC = ServiceC()
print(serviceC.cache.dynamicType)
我希望得到AbstractCache<C>.Type
,但我会得到AbstractCache<B>.Type
。为什么会发生这种情况?如何在cache
类实例中获取ServiceC
变量的正确类型?
答案 0 :(得分:3)
这是因为您明确地使用ServiceA
键入B
。您应该使用T
键入它以按您希望的方式运行。
尝试下面的代码,它可能会像你期待的那样工作。
// Tested @ Playground
class ServiceA<T: A>: AbstractService<T> {}
class ServiceB<T: B>: ServiceA<T> {}
class ServiceC<T: C>: ServiceB<T> {}
let serviceC = ServiceC()
print(serviceC.cache.dynamicType)
// prints "AbstractCache<C>\n"
答案 1 :(得分:2)
这些行:
class ServiceB<T: B>: ServiceA<B> {}
class ServiceC<T: C>: ServiceB<C> {}
需要:
class ServiceB<T: B>: ServiceA<T> {}
class ServiceC<T: C>: ServiceA<T> {}
如果您希望正确传递类型信息,则需要使用泛型类型T
。然后你的限制将通过所有泛型级联。