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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top