inizializzazione gruppo Class
-
01-10-2019 - |
Domanda
Il mio iPhone app ha una classe WorkingView astratta. Si tratta di una sottoclasse di UIView. WorkingView, a sua volta avere un gruppo di sottoclassi concrete. Due di questi saranno SimplifyView e MultiplyView.
Sto cercando di scrivere il metodo che crea nuove istanze di WorkingView. Questo metodo dovrebbe avere la modalità passati e restituire un'istanza della sottoclasse concreta appropriata. Per la risposta a questa domanda , questo è quello che ho finora :
+ (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;
}
Fin qui, tutto bene. Ma qui è il problema. Nel metodo init di SimplifyView, ho bisogno di eseguire l'oggetto attraverso il metodo init di UIView. Chiamata [super initWithFrame: telaio] mi viene solo per WorkingView, non tutto il modo di UIView. Suppongo che potrei creare un initWithFrame: metodo WorkingView che a sua volta chiama initWithFrame di UIView:. Metodo - ma che si sente hacker
Qual è il modo adeguato per gestire questo?
Soluzione
Se si chiama [super initWithFrame:frame]
dal vostro sottoclasse, il runtime scalare la gerarchia di ereditarietà alla ricerca di una classe che implementa tale metodo, a partire da eccellente. Se eccellente non implementa initWithFrame:
, il runtime manterrà arrampicata finché alla fine reperti e invoca l'implementazione di default in UIView.