Klasse Cluster-Initialisierung
-
01-10-2019 - |
Frage
Mein iPhone App hat eine abstrakte Klasse WorkingView. Es ist eine Unterklasse von UIView. WorkingView wird wiederum eine Reihe von konkreten Subklassen haben. Zwei davon werden SimplifyView und MultiplyView.
Ich versuche, die Methode zu schreiben, die neue Instanzen von WorkingView schafft. Diese Methode soll den Modus, in übergeben hat und eine Instanz der entsprechenden Betonunterklasse zurück. Pro die Antwort auf diese Frage , ist es das, was ich bisher :
+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
WorkingView *ret;
switch (mode) {
case simplifyMode:
ret = [[SimplifyView alloc]initWithFrame: frame];
break;
case multiplyMode:
ret = [[MultiplyView alloc]initWithFrame: frame];
break;
// additional cases here
default:
return nil;
}
// more initialization here
return ret;
}
So weit, so gut. Aber hier ist das Problem. In SimplifyView der init-Methode, ich brauche das Objekt durch UIView der init-Methode auszuführen. Der Aufruf [super initwithframe: frame] wird mir nur zu WorkingView, nicht den ganzen Weg nach UIView. Ich glaube, ich könnte eine Initwithframe erstellen: Methode in WorkingView das wiederum ruft UIView des Initwithframe:. Methode - aber das fühlt sich hackish
Was ist die angemessene Art und Weise zu handhaben?
Lösung
Wenn Sie [super initWithFrame:frame]
aus der Unterklasse aufrufen, wird steigen die Laufzeit die Vererbungshierarchie für eine Klasse suchen, implementiert diese Methode, mit Super-Start. Wenn Super initWithFrame:
nicht implementiert, wird die Laufzeit Klettern halten, bis es schließlich findet und ruft die Standardimplementierung in UIView.