【发布时间】:2016-07-20 20:09:16
【问题描述】:
上下文:
我有 A 类,它是 B 类的超类。A 类还具有在类声明中声明的泛型类型,它们被它的子类覆盖。
A 类有一个方法,该方法需要一个不属于类声明一部分的泛型参数。
B 类通过从类定义中指定泛型类型来覆盖类定义,并希望覆盖泛型函数。
例子:
class A<U: NSDictionary, Z: NSDictionary> : NSObject
{
func funcToOverride<T : JSONModel>()
{
}
}
class B : A<NSDictionary, NSDictionary>
{
override func funcToOverride<T:JSONModel>()
{
}
}
问题:
B 类无法覆盖该方法,编译器错误“方法未覆盖其超类中的任何方法”
问题:
1) 首先为什么会发生这种情况?
2) 有没有已知的方法可以避免这个问题?除了 B 之外,我的超类也是其他子类的超类,因此在类定义中添加泛型参数对于为单个函数定义类型是有问题的。
补充说明:
此代码是严格的!我在现有大型 SDK 中使用的更复杂代码的示例。我需要通过避免添加与当前上下文无关的协议或其他类来专门解决泛型冲突问题。
根据要求,以防有人觉得需要更大的上下文
更扩展的示例版本:
class A<ResponseModel : NSDictionary, RedirectModel : NSDictionary>: NSObject {
let existingCompletionHandler : (responseModel : ResponseModel?, error : NSError?) -> Void = {
(responseModel : ResponseModel?, error : NSError?) -> Void in
}
func presentWebViewAndWaitForRedirect(redirectQueryPath : String)
{
let queryPathToDict : [NSObject : AnyObject] = [:]
treatRedirectWithResponseParams(queryPathToDict) {[weak self] (model, error) in
self?.callSomeRandomRequestWithRedirectModel(model)
}
}
func callSomeRandomRequestWithRedirectModel(redirectModel : RedirectModel?)
{
let requestResult : [NSObject : AnyObject] = [:]
treatRequestResponse(requestResult, completionHandler: existingCompletionHandler)
}
func treatRedirectWithResponseParams(responseParams : [NSObject : AnyObject], completionHandler : (model : RedirectModel?, error : NSError?) -> Void)
{
funcToOverride(responseParams, completionHandler: completionHandler)
}
func treatRequestResponse(someRequestResult : [NSObject : AnyObject], completionHandler : (model : ResponseModel?, error : NSError?) -> Void)
{
funcToOverride(someRequestResult, completionHandler: completionHandler)
}
func funcToOverride<T : NSDictionary>(params : [NSObject : AnyObject], completionHandler : (model : T?, error : NSError?) -> Void)
{
}
}
class B: A<NSDictionary, NSDictionary> {
//wants to provide something additional or different to the base implementation but still respect the base class logic flow
override func funcToOverride<T : NSDictionary>(params: [NSObject : AnyObject], completionHandler: (model: T?, error: NSError?) -> Void) {
}
}
class SomeOtherRandomClass : NSDictionary
{
}
class C: A<NSDictionary, NSDictionary> {
func someOtherClassCRequest()
{
let response : [NSObject : AnyObject] = [:]
funcToOverride(response) { (model : SomeOtherRandomClass?, error : NSError?) in
}
}
}
【问题讨论】:
-
如此处所示,代码没有意义。您的问题缺少一些信息
JSONModel是什么?还有哪些其他类型符合或继承自JSONModel?T的目的是什么?它没有作为函数参数传递,那么它是如何使用的呢? -
示例是为了说明问题。如果它们遵循示例中的逻辑,您可以替换任何您想要的类。在“那里”的某个地方,类型 T 由调用此通用函数的其他函数确定。 T 是通用的,因为它有大约 3 种不同的类型,根据被调用函数,它将被“转换”为。无论如何,从 JSONModel 继承的其他类型或调用此函数的其他函数与所述问题无关。
标签: swift generics overriding