Kontext außer Kraft setzen:nicht funktionieren kann mit generischen Parameter
I Klasse A haben, die eine übergeordnete Klasse für Klasse B Klasse A ist auch generische Typen deklariert in der Klassendeklaration hat, die außer Kraft gesetzt werden, indem sie es untergeordneten Klassen ist.
Klasse A hat eine Methode, die einen generischen Parameter benötigt, der nicht Teil der Klassendeklaration ist.
Klasse B überschreibt die Klassendefinition, indem die generischen Typen aus der Klassendefinition angegeben werden und die generische Funktion überschrieben werden soll.
Beispiel:
class A<U: NSDictionary, Z: NSDictionary> : NSObject
{
func funcToOverride<T : JSONModel>()
{
}
}
class B : A<NSDictionary, NSDictionary>
{
override func funcToOverride<T:JSONModel>()
{
}
}
Problem:
1:
Klasse B die Methode mit Compiler-Fehler nicht außer Kraft setzen kann
Frage "Method keine Methode aus ihrer Oberklasse überschreibt") Warum tritt das überhaupt auf?
2) Gibt es bekannte Möglichkeiten, dieses Problem zu vermeiden? Meine Oberklasse ist neben B eine Oberklasse für andere untergeordnete Klassen. Daher ist das Hinzufügen eines generischen Parameters in der Klassendefinition problematisch, nur um einen Typ für eine einzelne Funktion zu definieren.
Zusätzliche Hinweise:
Dieser Code ist streng! ein Beispiel aus einem viel komplexeren Code, mit dem ich in einem vorhandenen großen SDK arbeite. Ich muss das Generika-Konfliktproblem spezifisch lösen, indem ich das Hinzufügen von Protokollen oder anderen Klassen, die nicht mit dem aktuellen Kontext zusammenhängen, vermeidet.
Wie falls jemand angefordert hat das Bedürfnis nach einem größeren Kontext
Eine ausgedehntere Probe Version:
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
}
}
}
Wie hier gezeigt, macht der Code wenig Sinn. Ihre Frage enthält einige Informationen Was ist 'JSONModel'? Welche anderen Typen entsprechen oder erben von 'JSONModel'? Was ist der Zweck von "T"? Es wird nicht als Funktionsparameter übergeben, also wie wird es verwendet? –
Die Probe soll das Problem zeigen. Sie können beliebige Klassen ersetzen, wenn sie der Logik im Beispiel folgen. Irgendwo "da" wird der Typ T von anderen Funktionen bestimmt, die diesen generischen bezeichnen. Und das T ist generisch, weil es ungefähr 3 verschiedene Typen hat, auf die es abhängig von der aufgerufenen Funktion "konvertiert" wird. Wie auch immer, andere Typen, die von JSONModel oder anderen Funktionen, die diese Funktion aufrufen, erben, sind für das angegebene Problem nicht relevant. – Fawkes